2015-10-20 106 views
1

我有一個數據集,看起來像這樣:如何解壓在列表中列出了一個清單

data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ] 

我想將它解壓縮,所以我有:

[[a,a], [e,g], [i,k]] and [[b,d], [f,h], [j,j]] 

在同一直線上,有沒有辦法獲得列表的長度,而不計算基於一個值的重複?例如,使用上面的第一個列表,我想計算每個子列表中的列表數量,而不計算第二個值中的重複項。所以我想:

[2, 2, 1] 

我能夠得到[2,2,2]使用的結果:

count = [len(i) for i in data] 

但因爲我不能單獨的值,有無法單獨檢查第二個值中的重複項。

+0

您是否試圖拼合您的清單並計算出現次數? http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python – user1767754

回答

1
>>> d = [ [[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]] ] 
>>> list(zip(*[list(zip(*x)) for x in d])) 
[((1, 3), (5, 7), (9, 11)), ((2, 4), (6, 8), (10, 12))] 

或與您的例子:

>>> d = [[['a', 'b'], ['a', 'd']], [['e', 'f'], ['g', 'h']], [['i', 'j'], ['k', 'j']]] 
>>> list(zip(*[list(zip(*x)) for x in d])) 
[(('a', 'a'), ('e', 'g'), ('i', 'k')), (('b', 'd'), ('f', 'h'), ('j', 'j'))] 

至於你的票,因爲你只想看第二值,你可以過濾那些出來,創建了一套他們擺脫的重複值,然後計算它們:

>>> [len(set(x[1] for x in y)) for y in d] 
[2, 2, 1] 
+0

我基本上想要計算每個列表內的列表數量。現在,每個列表都有兩個列表(ex,[[1,2],[3,4]]會給出2)。但是,我希望第二個值中的重複項不被計數。 (例如[[1,2],[3,2]]會給出1)。 另外...我明白應該在代碼中發生什麼,但我得到一個錯誤「ValueError:需要超過0個值來解壓縮」 – j2120

0

要轉你的子列表:

data = [ [["a","b"],["a","d"]], [["e","f"],["g","h"]], [["i","j"],["k","j"]] ] 

a,b = (map(list,zip(*(map(list, zip(*sub)) for sub in data)))) 

print(a,b) 
[['a', 'a'], ['e', 'g'], ['i', 'k']] [['b', 'd'], ['f', 'h'], ['j', 'j']] 

爲了得到計數,你可以使用一組:

print([len(set(map(itemgetter(1), sub)))for sub in data]) 

[2, 2, 1] 

一組不超過兩子列表,即工作:

data = [[["a", "b"], ["a", "d"]], [["e", "f"], ["g", "h"]], [["i", "j"], ["k", "j"], ["A", "K"], ["B", "K"]]] 

from collections import Counter 
from operator import itemgetter 

print([sum(v == 1 for v in Counter(map(itemgetter(1), sub)).values()) for sub in data]) 
[2, 2, 0] 

如果您使用一組與最後一個數據你會得到[2, 2, 2],我認爲這將是錯誤的,因爲沒有獨特的價值

0

這個答案不使用地圖或列表的理解,但只是for循環直截了當。

data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ] 

zip0 = [] 
zip1 = [] 
sub0=[] 
sub1=[] 

for x in data: 
    for y in x: 
     sub0.append(y[0]) 
     sub1.append(y[1]) 
    zip0.append(sub0) 
    zip1.append(sub1) 
    sub0 = [] 
    sub1 = [] 

print zip0 
print zip1