2017-02-03 286 views
0

我有元組的列表:如果第二個元素相同,則將列表中的第一個元素合併爲一個元組?

[('Donald', 'PERSON'), ('Trump', 'PERSON'), ('enters', 'O'), ('the', 'O'), ('White', 'LOCATION'), ('House', 'LOCATION')] 

,我想輸出是:

[('Donald Trump'), ('enters the'), ('White House')] 

下面的代碼讓我更接近想要的結果,但我不是很熟悉groupby功能呢。

mergedTags = [] 
    from itertools import groupby 
    for tag, chunk in groupby(tagList, lambda x: x[1]): 
     if tag != "O": 
      tagMerged = " ".join(w for w, t in chunk) 
      mergedTags.extend([tagMerged]) 
     else: 
      #tagMerged = " ".join(t for t, w in chunk) 
      for word, chunk in groupby(tagList, lambda x: x[0]): 
       mergedTags.extend([word]) 

    print(mergedTags) 
+0

爲什麼基於'你有一個條件「O''? –

+0

斯坦福大學Entitiy識別器標記未被識別爲「O」的元素。 – Yanic

回答

1

您可以使用itertools.groupby列表理解表達爲:

from itertools import groupby 
my_list = [('Donald', 'PERSON'), ('Trump', 'PERSON'), ('enters', 'O'), ('the', 'O'), ('White', 'LOCATION'), ('House', 'LOCATION')] 

output_list = [tuple(i[0] for i in e) for _, e in groupby(my_list, lambda x: x[1])] 
#    ^generate the desired tuple 

output_list數值保持將是:

[('Donald', 'Trump'), ('enters', 'the'), ('White', 'House')] 
+0

注意:只有它們在一起時,元組纔會合併。 'groupby'對連續的元素進行分組。如果有可能被分發;您必須首先根據索引1對輸入列表進行排序,即'sorted(my_list,key = lambda x:x [1])' –

相關問題