【问题标题】:How to create subset lists with underscores from a list Python如何从列表 Python 中创建带有下划线的子集列表
【发布时间】:2017-08-29 02:39:25
【问题描述】:

我有一个名为动物的列表,

animals = ["B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
         "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"]

并且想要以下输出:

 A = ["A_CAT", "A_DOG", "A_MOUSE"]
 B = ["B_DOG", "B_MOUSE", "B_FOX"]
 C = ["C_DUCK", "C_FOX", "C_BIRD"]

我只能得到这样的字母或动物的子集列表:

  [species.split("_",1)[1] for species in animals]
  ['FOX', 'CAT', 'DOG', 'MOUSE', 'DOG', 'MOUSE', 'DUCK', 'FOX', 'BIRD']

  [letters.split("_",1)[0] for letters in animals]
  ['B', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C']

不确定我的问题措辞是否正确。对于解决这个棘手问题的任何帮助将不胜感激!

【问题讨论】:

  • 用文字解释您如何想象从这里开始,您会找到帮助。

标签: python list subset list-comprehension


【解决方案1】:

您可以构建单独的列表,每个首字母都有一个列表,但是,如果您有很多字母,这会很棘手。您可以改用defaultdict

from collections import defaultdict

d = defaultdict(list)
animals = ["B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
     "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"]

for animal in animals:
   d[animal[0]].append(animal)
print(dict(d))

输出:

{'A': ['A_CAT', 'A_DOG', 'A_MOUSE'], 'C': ['C_DUCK', 'C_FOX', 'C_BIRD'], 'B': ['B_FOX', 'B_DOG', 'B_MOUSE']}

【讨论】:

  • 您好阿贾克斯,感谢您的帮助!输出很酷,似乎有效。
  • @MichaelRSF 很高兴为您提供帮助!
【解决方案2】:

您可以从一次调用split 中解压前缀和名称的值:

groups = {}
for animal in animals:
    prefix, name = animal.split("_")
    if prefix not in groups:
        groups[prefix] = []
    groups[prefix].append(animal)

print groups

{'A': ['A_CAT', 'A_DOG', 'A_MOUSE'], 'C': ['C_DUCK', 'C_FOX', 'C_BIRD'], 'B': ['B_FOX', ' B_DOG', 'B_MOUSE']}

如果需要,您以后仍然可以将 dict 解包为单个变量:

A = groups["A"]
B = groups["B"]
C = groups["C"]

如果你想去掉前缀:

groups = {}
for animal in animals:
    prefix, name = animal.split("_")
    if prefix not in groups:
        groups[prefix] = []
    groups[prefix].append(name)

【讨论】:

    【解决方案3】:

    根据第一个字母尝试itertools.groupby

    import operator as op
    import itertools as it
    
    
    animals = [
        "B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
        "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"
    ]
    
    A, B, C = [list(g) for _, g in it.groupby(sorted(animals), key=op.itemgetter(0))]
    

    输出:

    A
    # ['A_CAT', 'A_DOG', 'A_MOUSE']
    
    B
    # ['B_DOG', 'B_FOX', 'B_MOUSE']
    
    C
    # ['C_BIRD', 'C_DUCK', 'C_FOX']
    

    这是postgroupby 的工作原理。

    【讨论】:

    • 这很简洁,直到现在我才知道操作员模块。谢谢 pylang!
    • 另一个关键选项是常规函数,如def f(x): x[0]lambda x: x[0]
    • 这将是最后一个可读性和易于理解的,但它绝对是最短的解决方案;-)
    • @Hubert Grzeskowiak,我可能同意理解,groupby 就是这样。它是更难理解的迭代工具之一。但是,我认为它读起来很好。为了清楚起见,我将添加一个链接。谢谢。
    • 也感谢您的解决方案,休伯特!非常感谢所有帮助:)
    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多