Python:减少列表但保留详细信息

时间:2012-09-03 18:27:27

标签: python list reduce

说我有一个项目列表,其中一些项目在某一点上是相似的 但后面有一个点后面的数字

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

... 哇,我没那么快就想到这么多好的答案,谢谢

2 个答案:

答案 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,))]