2016-07-08 4 views
0

によって、私は次のリストがあります
グループリストのpython

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%') 

、誰もが私かどうか私を導くことができますが希望の出力を得るためにzip以外のものを使うべきです。グルーピング

答えて

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

+0

ありがとうございました! – Shany

関連する問題