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 元素元组添加到字典并更新乘法
  4. 使用字典sum上的函数values

我想知道是否有一种pythonic方法可以减少这种情况。我很确定我在这里把事情复杂化了。

4

4 回答 4

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

元组列表仅迭代一次,并且元素被删除,因为它们不需要。

于 2013-06-05T19:50:38.327 回答
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
于 2017-03-13T16:57:25.987 回答
0

一旦我通过键拆分了您的元组,我将使用reduceand来获取列表的产品: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
于 2017-03-13T17:36:26.847 回答
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
于 2017-03-13T17:41:52.670 回答