2017-01-10 117 views
3

我一直沒有做python很長時間,而且我很困擾這個問題。我有一個列表,其中可能包含其他列表,其中每個列表都包含不同數量的元組。我試過使用以前回答的問題,如grouping python lists of lists,sorting and grouping nested lists和其他方法,如使用計數器,但他們似乎沒有在我的清單上工作,其輸出如下所示(這是我的輸入數據):在列表中包含元組列表中的項目python

[('T0931', 'AB', '0.7826705747628963')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] 

我想我的列表(元組列表)的格式與其他問題中使用的格式不同。當我問它的數據類型談到了列表,元組,字符串,但打印這些問題的答案很多次:

print(type(Data)) 
# Returns list 
print(type(Data[0])) 
# Returns tuple 
print(type(Data[0][0])) 
# Returns str 

#output looks like this: 
<class 'list'> 
<class 'list'> 
<class 'list'> 
<class 'list'> 
<class 'list'> 

即使當我試圖解決這個名單使用排序(第2次嘗試),他們的所有返回變種由許多空列表分開相同未分組列表:

# Q is name of list 
#attempt 1:  
def grouper(sequence): 
      result = [] 

      for item in sequence: 
        for members, group in result: 
          if members.intersection(item): 
            members.update(item) 
            group.append(item) 
            break 
        else: 
          result.append((set(item), [item])) 
      return [group for members, group in result] 
    output=grouper(Q) 
    print(output) 

#attempt 2: 
import itertools 
    import operator 
    Q=sorted(q,key=operator.itemgetter(0)) 
    for key,group in itertools.groupby(Q,operator.itemgetter(0)): 
      print(list(group)) 

#attempt 3: 
from collections import Counter 
    C = Counter(Q) 
    for list,v in C.items(): 
      print ([list,]*v) 

我將在位置1喜歡組這個列表首先由TXXXX數目在位置0,然後由這兩個字母,同時保留每組中的所有重複的元素。然而,如何將Txxxx編號分組的詳細說明會很有幫助,所以我可以弄清楚如何對位置1的字母自己做同樣的操作。所需的輸出應該如下所示:

[[('T0931', 'AB', '0.7826705747628963')],[('T0932', 'AB', '0.6395086105062'),('T0932', 'AB', '0.63950861050628')],[('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), ('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]] 

此外,在這種情況下,我不相信做一本字典就可以了(這是我看到了類似的問題做了),因爲這僅僅是列表的樣本中,完整列表在位置0包含許多不同的Txxxx數字。

在此先感謝您。

+0

從你提供的內容我不相信你的數據是一個列表清單。你能否提供預期的輸入和期望的輸出?如果不能直觀地看到你想要的東西,這有點令人困惑。 –

+0

我編輯它,試圖使其更清晰,其中包括從另一部分代碼混合導致原始輸出中出現空列表的數據類型的新輸出。 – Emma

回答

0

您可以使用defaultdict保留所有的值對於每個TX /碼組合

from collections import defaultdict 

d = defaultdict(list) 
for group in q: 
    for tx, code, value in group: 
     d[tx, code].append(value) 
+0

不幸的是,這種方法導致了錯誤:'太多的值解壓縮(預期3)' – Emma

+1

@Emma嘗試,'對於tx,代碼,*值在組:d [tx,code] .append(值)'。只需添加一個'*'來允許任意數量的下列項目進入一個變量。這應該只是如此,如果你的元組超過3個項目。 –

0

您可以通過使用組,就像這樣:

my_list=[('T0931', 'AB', '0.7826705747628963'),('T0932', 'AB', '0.63950861050628'), 
('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), 
('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), 
('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), 
('T0932', 'AB', '0.63950861050628'),('T0933', 'AB', '0.8960345460457968'), 
('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), 
('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), 
('T0933', 'EF', '0.8941510860547524')] 
import itertools 

res =[] 
for key, value in itertools.groupby(my_list, lambda x: x[0]): 
    l=[] 
    for val in value : 
     l.append(val) 
    res.append(l) 

輸出:

[[('T0931', 'AB', '0.7826705747628963')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]] 
+0

@ KHELILI Hamza有沒有辦法讓輸出看起來更像'[[('T0931','AB','0.7826705747628963')],[('T0932','AB','0.6395086105062'),(' ('T0933','AB','0.63950861050628')],[('T0933','AB','0.8960345460457968'),('T0933','AF','0.8951297220212914' ('T0933','EF','0.8941510860547524'),('T0933','CD','0.8951298105762795'),('T0933','DE','0.8951299080330034' T0933','AB','0.8960345460457968'...)]]'這樣每個Txxxx數字都有它自己的列表,其中包含該列表中Txxxx數字的所有元組實例? – Emma

相關問題