2017-02-13 55 views
0

附上我有它針對每個項目3個元素列表,它看起來像這樣:計數,並與相應的變量

list_A = [(['apple','orange','banana'], 2,0.1), 
      (['grape', 'water', 'fountain'], 4, 0.2), 
      (['apple', 'grape', 'banana',], 6, 0.3), 
      (['orange', 'water', 'apple',], 8, 0.4),...] 

首先,我想在整個列表中每字段出現,然後附上它們的對應變量以形成新列表。

例如(參見第一行),出現爲術語(「蘋果」)的數目是在整個列表,然後其兩個相應的變量被附接在一起。結果應該是這樣的:

new_list = [('apple', 3, 2, 0.1), 
      ('apple', 3, 6, 0.3), 
      ('apple', 3, 8, 0.4), 
      ('orange', 2, 2, 0.1), 
      ('banana', 2, 2, 0.1), 
      ('grape', 2, 4, 0.2), 
      ('water', 2, 4, 0.2),......] 

我一直在努力和調整使用from collections import Counter

回答

2

下面這個函數Counter(x[0] for elem in each)得到它是如何做這件事:

from collections import Counter 

counts = Counter(sum((row[0] for row in list_A), [])) 

for row in list_A: 
    print [(el, counts[el]) + row[1:] for el in row[0]] 

這裏,sum((row[0] for row in list_A), [])將字符串子列表合併爲一個。其餘的應該很明顯。

+0

非常感謝您的快速反應! – htetmyet

1

該版本使用功能性方法從元組列表中提取字符串。

from collections import Counter 
from itertools import chain 
from operator import itemgetter 

list_A = [ 
    (['apple', 'orange', 'banana'], 2, 0.1), 
    (['grape', 'water', 'fountain'], 4, 0.2), 
    (['apple', 'grape', 'banana',], 6, 0.3), 
    (['orange', 'water', 'apple',], 8, 0.4), 
] 

counts = Counter(chain.from_iterable(map(itemgetter(0), list_A))) 

new_list = [] 
for row in list_A: 
    head, tail = row[0], row[1:] 
    for u in head: 
     new_list.append((u, counts[u]) + tail) 

new_list.sort() 
for row in new_list: 
    print(row) 

輸出

('apple', 3, 2, 0.1) 
('apple', 3, 6, 0.3) 
('apple', 3, 8, 0.4) 
('banana', 2, 2, 0.1) 
('banana', 2, 6, 0.3) 
('fountain', 1, 4, 0.2) 
('grape', 2, 4, 0.2) 
('grape', 2, 6, 0.3) 
('orange', 2, 2, 0.1) 
('orange', 2, 8, 0.4) 
('water', 2, 4, 0.2) 
('water', 2, 8, 0.4) 
+0

感謝您的解決方案:) – htetmyet

+0

@htetmyet無後顧之憂。我開始研究它,但後來我被打斷了。當我回來時NPE已經發布了他們的解決方案,但我想你可能有興趣看到一個稍微不同的方法。 :) –