2013-05-30 92 views
1

我有一個像下面乘的元組元素的元組的第一個元素相匹配否則忽略

[(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)] 

我要乘的元組的第二個元素的元組的列表,如果第一個元素匹配(一次或多次);如果不是,我會忽略這個元組。因此,輸出應該是

33 * 28 + 95 * 69 = 7479 

目前,我做了以下內容:

  1. 使用計數器來檢查元組的第一個元素的存在。
  2. 迭代集合以查看是否存在1元組元組或更多;忽略了1元的人
  3. 迭代非1元的元組在字典的values添加到字典和更新乘
  4. 使用sum功能

我不知道是否有一個Python化的方式來減少這一點。我很確定我在這裏使事情變得複雜。

+0

的Python的方式很可能是沿着線:有字典的鍵是第一個元素,並沿着整個列表走一遍,更新字典。每個值都包含「它看起來不止一個」和「這是迄今爲止這些項目的產品」等信息。 –

+0

我不知道是否像'ifilter'可以幫助。 – Dexter

+1

在你的地方,我會按照上面描述的步驟編寫算法,而不用擔心一些itertools函數。 –

回答

0

我會編程,這樣的事情

collection = [(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)] 
output = 0 
for elem in collection: 
    collection.remove(elem) 
    new_collection = collection 
    part_output = 0 
    for new_elem in new_collection: 
     if elem[0] == new_elem[0]: 
      part_output = (part_output * new_elem[1]) if part_output != 0 else (elem[1] * new_elem[1]) 
      collection.remove(new_elem) 
    output = output + part_output 

print output 

元組列表迭代只有一次,那些不需要的元素被移除。

0

驚訝,沒有很好地回答這個問題...... 這是我的看法:

test = [(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)] 
unique_keys = set([pair[0] for pair in test]) #{0, 1, 2, 3, 4} 
grouped_by_key = [[el[1] for el in test if el[0] == key] for key in unique_keys] # [[33, 28], [12], [3], [26], [95, 69]] 
grouped_by_key = filter(lambda x: len(x) > 1,grouped_by_key) # [[33, 28], [95, 69]] 

add = lambda x, y : x+y 
mul = lambda x, y : x*y 
# Alternatively: 
# from operator import add, mul 

out = reduce(add, map(lambda x: reduce(mul, x), grouped_by_key)) #7479 
+0

這不會運行。除了缺少註釋字符,'xx'是未定義的。此外,共識似乎是答案是7479,而不是7476 – cdlane

+0

修復了重命名變量後錯誤的xx位。另外我得到的結果是正確的...只是手動從控制檯上粘貼錯誤!感謝您發現 – FLab

+1

在第二行中,您使用三個概念'set'' map'和'lambda'來獲取唯一鍵,爲什麼不'set([pair [0] for test in test])'而不是?列表理解和詞典理解非常方便。 –

0

我會用reducemul得到一個列表的產品一旦我通過按鍵分割你的元組:

test = [(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)] 
grouped_by_key = {pair[0] : [] for pair in test} #Initialize dict to hold items 
tmp = [grouped_by_key[pair[0]].append(pair[1]) for pair in test] #Add items in lists by keys 

現在進口一些東西:

from functools import reduce #reduces iterables 
from operator import mul #helps doing multiply for a list 

現在使用導入功能,從而獲得所需結果:

sum([reduce(mul,v,1) for v in grouped_by_key.values() if len(v) > 1]) 
7479 
0

我在混扔defaultdict簡化相結合的比賽。我也包括代碼產生方程本身可以註釋掉:

from collections import defaultdict 
from operator import mul 

pairs = [(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)] 

table = defaultdict(list) 

for key, value in pairs: 
    table[key].append(value) 

result = 0 
equation = [] 

for value in table.values(): 
    if len(value) > 1: 
     equation.append(' * '.join(map(str, value))) 
     result += reduce(mul, value) 

print ' + '.join(equation), '=', result 

輸出

33 * 28 + 95 * 69 = 7479 
相關問題