2

假设我有一个项目列表,其中一些项目在一定程度上相似,但在一个点后相差一个数字

['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,并提前感谢

...哇,我没想到这么快就有这么多很棒的答案,谢谢

4

2 回答 2

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()
于 2012-09-03T18:32:09.850 回答
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,))]
于 2012-09-03T18:39:43.543 回答