我是Python的新手。如果我有一个'数据'像这样的变量:
data = [['water', 'chips', 'pie', 'fruit', 200], ['soda', 'nuts', 'cake', 'vegetables', 300], ['water', 'chips', 'cake', 'fruit', 40], ['soda', 'crackers', 'cake', 'vegetables', 80]]
我有一个这样的清单:
ls = [['water', 'chips'], ['soda', 'nuts']]
如何返回包含这两个值的data[i][4] for i in data
之和并将其附加到列表中。
total = 0
for i in data:
for x in ls
if i contains x:
ls[2] = total += total
# should return
ls = [['water', 'chips', 240], ['soda', 'nuts', 300]]
ls
中的最后一个元素是包含data[3][4]
和 ls[1]
ls[2]
的总和
答案 0 :(得分:1)
res = [
e + # filter list itself
[
sum( # sum all
l[4] # get fourth item if contains all
for l in data # take each element of data
if all(i in l for i in e) # check if contains all filter list
)
] # concat sum to list itself
for e in ls # take each element of filter list
]
答案 1 :(得分:0)
这是我的方法:使用集合中的Counter来跟踪总和。我们使用每个子列表中的前两项作为键,最后一项作为值:
from collections import Counter
data = [
['water', 'chips', 'pie', 'fruit', 200],
['soda', 'nuts', 'cake', 'vegetables', 300],
['water', 'chips', 'cake', 'fruit', 40],
['soda', 'crackers', 'cake', 'vegetables', 80]]
ls = [['water', 'chips'], ['soda', 'nuts']]
counter = Counter()
for item in data:
if item[:2] in ls:
counter.update({tuple(item[:2]): item[-1]})
result = [list(k) + [v] for k, v in counter.iteritems()]
print result
由于Counter
的行为类似于字典,而字典不将列表作为键,因此我们必须将前两个元素的列表转换为元组(因此tuple(item[:2])
)。