如果元组中的第一个元素匹配,则将元组元素相乘,否则忽略

时间:2013-05-30 00:22:25

标签: python python-2.7 tuples multiplication

我有一个像下面这样的元组列表

[(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元素元组添加到字典中并更新乘法
  4. 在词典sum上使用values功能
  5. 我想知道是否有一种减少这个的pythonic方法。我很确定我在这里很复杂。

4 个答案:

答案 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)

在我按键拆分元组后,我会使用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

答案 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