我有一个像下面这样的元组列表
[(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)]
我希望将元组的第二个元素乘以第一个元素匹配(一次或多次);如果不是我忽略了元组。所以,输出应该是
33 * 28 + 95 * 69 = 7479
目前,我正在做以下事情:
sum
上使用values
功能我想知道是否有一种减少这个的pythonic方法。我很确定我在这里很复杂。
答案 0 :(得分: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
元组列表只迭代一次,元素被删除,因为不需要元素。
答案 1 :(得分:0)
对这个问题没有好的答案感到惊讶...... 这是我的看法:
0.703727602527463
1.03799340156792
1.15220874833614
1.30381769320552
1.42656613017171
1.77287504108163
答案 2 :(得分:0)
在我按键拆分元组后,我会使用reduce
和mul
来获取列表的产品:
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
答案 3 :(得分: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