我有一个清单:
L= ['v1_A', 'v1_B', 'v1_C', 'V2_A', 'V2_B', 'V2000_A']
我希望将其拆分为子列表,以便包含V1的所有值都成为一个(sub?)列表,所有包含&#34; V2&#34;,&#34; V2000&#34;等的值< / p>
子列表的长度和数量可以不同,但所有都由下划线之前的部分标识。
答案 0 :(得分:4)
如果您希望按初始值分组字符串,则有两种选择:
使用itertools.groupby()
;如果您的数据已经按照第一个值排序,这会使分组变得容易:
from itertools import groupby
grouped = [list(g) for k, g in groupby(L, lambda s: s.partition('_')[0])]
这里的lambda为groupby()
提供了要分组的值;它将为您提供单独的生成器(在上面的代码中分配给g
),它将产生组密钥不变的值。由于lambda生成每个字符串的第一部分,这意味着输入分组在v1
,V2
,V2000
等前缀上。
使用字典按公共前缀对项目进行分组。如果您的输入不已排序:
,请使用此选项grouped = {}
for elem in L:
key = elem.partition('_')[0]
grouped.setdefault(key, []).append(elem)
grouped = grouped.values()
如果您使用Python 3,那么最后一行将是grouped = list(grouped.values())
两者都为每个前缀生成一个嵌套列表,按该前缀对所有值进行分组。两者都使用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