按列表python分组

时间:2016-07-08 15:17:48

标签: python list python-2.7 tuples

我有以下清单:

input=[(u'Number', u'Twenty', u'20.0'), (u'Number', u'five', u'5'), (u'fraction', u'one', u'1'), (u'fraction', u'in', u'/'), (u'fraction', u'five', u'5'), (u'Number', u'50 percent', u'50%')]<br>

我想做一个小组,但保持相同的顺序。我想要的输出是:

[(u'Number', u'Twenty five', u'20.0 5'), (u'fraction', u'one in five', u'1 / 5'), (u'Number', u'50 percent', u'50%')]

我使用了以下代码:

list1=[]
list2=[]
for key, wordz in groupby(input, lambda t: t[0]):
    s=key,' '.join(item[1] for item in wordz)
    list1.append(s)

for key, wordz in groupby(input, lambda t: t[0]):
    s=' '.join(item[2] for item in wordz)
    list2.append(s)
result=zip(list1,list2)
print result

我得到的是以下结果:

[((u'Number', u'Twenty five'), u'20.0 5'), ((u'fraction', u'one in five'), u'1 / 5'), ((u'Number', u'50 percent'), u'50%')

请任何人都可以指导我是否应该使用拉链以外的东西来获得我想要的输出。

1 个答案:

答案 0 :(得分:0)

分组之后,检查您的组长度以查看哪些组需要修改(基于长度),然后合并每组中元组中的非重复单词join

这样做:

inp = [(u'Number', u'Twenty', u'20.0'), (u'Number', u'five', u'5'), (u'fraction', u'one', u'1'), (u'fraction', u'in', u'/'), (u'fraction', u'five', u'5'), (u'Number', u'50 percent', u'50%')]

res = []
for i, g in groupby(inp, lambda t: t[0]):
    g = list(g)
    if len(g) > 1:
        g = [tuple(' '.join(i) if len(set(i)) > 1 else i[0] for i in zip(*g))]
    res.extend(g)

print(res)
# [('Number', 'Twenty five', '20.0 5'), ('fraction', 'one in five', '1 / 5'), ('Number', '50 percent', '50%')]

尽量不要使用内置名称作为名称。 input