在列表的列表中操作值



我查找一个包含列表的列表,操作如下:

#          key
example = [[2,   2, -10, 'Yes'],
[2,   8,  21, 'Yes'],
[2,  19,  14, 'Non'],
[2,  30, -22, 'Non'],
[4, -15,  31, 'Yes'],
[4,   2,  17, 'Yes'],
[4,   3, -90, 'Non']]

# What I have tried through dictionaries 
dictsum = dict()
for i in example:
if i[0] in dictsum.keys():
if i[3] == "Yes":
dictsum[i[0]][0] = dictsum[i[0]][0]+i[1]
dictsum[i[0]][1] = dictsum[i[0]][1]+i[2]
else:
dictsum[i[0]] = [i[1], i[2]]

onlysum = [[k,v[0], v[1]] for k,v in dictsum.items()]        

如前所述,已经添加了所有行'i[1]'和'i[2]',尊重它们的键'i[0]'和条件'i[3]'。

我想做的是找到距离零最远的值,如果I [3] == "Non"并根据对应的键'i[0]'添加该值

应该是这样的:

result = [[2,   10 + 30,   11 +(-22)], 
[4,   -13 + 3,   48 +(-90)]]
# Finally
result = [[2, 40, -11], 
[4, -10, -42]]

我澄清,这是我自己提出的一个例子,以了解在这些情况下列表是如何操作的,我不是专家。如果有人知道如何给你一个解决方案和反馈,我很感激你的分享,诚挚的问候。

  1. 首先收集所有" yes ";价值观:
dictsum = {i[0]: [sum(x[1] for x in example if x[0]==i[0] and x[-1]=="Yes"), 
sum(x[2] for x in example if x[0]==i[0] and x[-1]=="Yes")] for i in example}
>>> dictsum
{2: [10, 11], 4: [-13, 48]}
  1. 使用max更新每个键的第0和第1个列表元素,并使用所需的key函数:
output = {k: [v[0]+max([l[1] for l in example if l[0]==k and l[-1]=="Non"], key=abs), 
v[1]+max([l[2] for l in example if l[0]==k and l[-1]=="Non"], key=abs)] 
for k,v in dictsum.items()}
>>> output
{2: [40, -11], 4: [-10, -42]}

你可以这样做:

dictsum = collections.defaultdict(lambda: [0, 0])
max_non_values = collections.defaultdict(lambda: [0, 0])
def special_max(x, y):
if abs(x) < abs(y):
return y
elif abs(x) > abs(y):
return x
else:
return max(x, y)

for key, val_1, val_2, include in example:
if include == "Yes":
dictsum[key][0] = dictsum[key][0] + val_1
dictsum[key][1] = dictsum[key][1] + val_2
else:
max_non_values[key][0] = special_max(max_non_values[key][0], val_1)
max_non_values[key][1] = special_max(max_non_values[key][1], val_2)
onlysum = [[k, dictsum[k][0]+max_non_values[k][0], dictsum[k][1]+max_non_values[k][1]] for k in dictsum]

因为你取的是一个和,所以使用defaultdict比在dict中检查键更快更简单;您还需要进行两次传递,或者使用两个字典。此外,我建议将值设置为"example";一个类,或者至少一个命名元组。收集数据作为非结构化整数和字符串的异构列表变得难以管理,超出几行代码。

最新更新