根据部分值将列表拆分为子列表

时间:2014-08-05 11:03:01

标签: python

我有一个清单:

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']

我希望将其拆分为子列表,以便包含V1的所有值都成为一个(sub?)列表,所有包含&#34; V2&#34;,&#34; V2000&#34;等的值< / p>

子列表的长度和数量可以不同,但​​所有都由下划线之前的部分标识。

6 个答案:

答案 0 :(得分:4)

如果您希望按初始值分组字符串,则有两种选择:

  1. 使用itertools.groupby();如果您的数据已经按照第一个值排序,这会使分组变得容易:

    from itertools import groupby
    
    grouped = [list(g) for k, g in groupby(L, lambda s: s.partition('_')[0])]
    

    这里的lambda为groupby()提供了要分组的值;它将为您提供单独的生成器(在上面的代码中分配给g),它将产生组密钥不变的值。由于lambda生成每个字符串的第一部分,这意味着输入分组在v1V2V2000等前缀上。

  2. 使用字典按公共前缀对项目进行分组。如果您的输入已排序:

    ,请使用此选项
    grouped = {}
    for elem in L:
        key = elem.partition('_')[0]
        grouped.setdefault(key, []).append(elem)
    grouped = grouped.values()
    

    如果您使用Python 3,那么最后一行将是grouped = list(grouped.values())

  3. 两者都为每个前缀生成一个嵌套列表,按该前缀对所有值进行分组。两者都使用str.partition()来拆分第一个_下划线之前的部分。

    演示:

    >>> from itertools import groupby
    >>> L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
    >>> [list(g) for k, g in groupby(L, lambda s: s.partition('_')[0])]
    [['v1_A', 'v1_B', 'v1_C'], ['V2_A', 'V2_B'], ['V2000_A']]
    >>> grouped = {}
    >>> for elem in L:
    ...     key = elem.partition('_')[0]
    ...     grouped.setdefault(key, []).append(elem)
    ... 
    >>> grouped.values()
    [['V2_A', 'V2_B'], ['V2000_A'], ['v1_A', 'v1_B', 'v1_C']]
    

答案 1 :(得分:1)

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
new_L = []
for i in L:
    new_item = i.split('_')
    new_L.append(new_item)
print new_L

Output: [['v1', 'A'], ['v1', 'B'], ['v1', 'C'], ['V2', 'A'], ['V2', 'B'], ['V2000', 'A']]

希望这会给你带来理想的结果。

答案 2 :(得分:1)

这些天我似乎越来越多地接触itertools.groupby()

from itertools import groupby

def keyfunc(item):
    return item.split('_')[0]

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']

grouped_list = [list(v) for k,v in groupby(sorted(L), keyfunc)]

>>> grouped_list
[['V2000_A'], ['V2_A', 'V2_B'], ['v1_A', 'v1_B', 'v1_C']]

另一种方法是使用collections.defaultdict。列表的defaultdict提供了一种在字典中创建列表的简洁方法:

from collections import defaultdict

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
d = defaultdict(list)
for s in L:
    d[s.split('_')[0]].append(s)

grouped_list = d.values()

>>> grouped_list
[['v1_A', 'v1_B', 'v1_C'], ['V2_A', 'V2_B'], ['V2000_A']]

答案 3 :(得分:1)

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
print [s.split('_') for s in L]

结果:

[['v1', 'A'], ['v1', 'B'], ['v1', 'C'], ['V2', 'A'], ['V2', 'B'], ['V2000', 'A']]

或者如果它不是您要找的东西:

d = {}
for s in L:
    key, value = s.split('_')
    l = d.get(key, [])
    l.append(value)
    d[key] = l

结果:

>>> d
{'v1': ['A', 'B', 'C'], 'V2': ['A', 'B'], 'V2000': ['A']}
>>> d.values()
[['A', 'B', 'C'], ['A', 'B'], ['A']]

答案 4 :(得分:0)

仅提取一个子列表:

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
sublist = []
for item in L:
    if item[:2] == 'v1': B.append(item)
print sublist

答案 5 :(得分:0)

如果要拆分和分组

字典是最佳选择

L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
new_L = {}
for i in L:
    new_item = i.split('_')
    if new_item[0] in new_L:
        new_L[new_item[0]].append(i)
    else:
        new_L[new_item[0]] = []
        new_L[new_item[0]].append(i)
print new_L

输出

{'v1': ['v1_A', 'v1_B', 'v1_C'], 'V2': ['V2_A', 'V2_B'], 'V2000': ['V2000_A']}

无论如何我同意@sesha