说我有一个项目列表,其中一些项目在某一点上是相似的 但后面有一个点后面的数字
['abc.1',
'abc.2',
'abc.3',
'abc.7',
'xyz.1',
'xyz.3',
'xyz.11',
'ghj.1',
'thj.1']
我想从这个列表中产生一个新列表,它会折叠倍数,但会保留一些数据,即数字后缀 所以上面的列表应该产生一个新列表
[('abc',('1','2','3','7'))
('xyz',('1','3','11'))
('ghj',('1'))
('thj',('1'))]
我所想的是,第一个列表可以通过点分成对 但是后来我如何将第一部分分组,而不会丢失第二部分
如果这个问题是noobish,我很抱歉,并提前感谢
... 哇,我没那么快就想到这么多好的答案,谢谢
答案 0 :(得分:5)
from collections import defaultdict
d = defaultdict(list)
for el in elements:
key, nr = el.split(".")
d[key].append(nr)
#revert dict to list
newlist = d.items()
答案 1 :(得分:1)
使用分隔符函数映射列表,使用带有第一个元素的键的itertools.groupby
,并将第二个元素收集到结果中。
from itertools import groupby, imap
list1 = ["abc.1", "abc.2", "abc.3", "abc.7", "xyz.1", "xyz.3", "xyz.11", "ghj.1", "thj.1"]
def break_up(s):
a, b = s.split(".")
return a, int(b)
def prefix(broken_up): return broken_up[0]
def suffix(broken_up): return broken_up[1]
result = []
for key, sub in groupby(imap(break_up, list1), prefix):
result.append((key, tuple(imap(suffix, sub))))
print result
输出:
[('abc', (1, 2, 3, 7)), ('xyz', (1, 3, 11)), ('ghj', (1,)), ('thj', (1,))]