如何在具有多个条件的单独元组列表中减去最后一个 number/element?

How to subtract the last number/element in a separate list of tuples having multiple criteria?

samplelist1 = [('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass', 10), ('B', 'Failed', 5) ]

samplelist2 = [('A', 'Pass', 2), ('A', 'Failed', 1), ('B', 'Failed', 2)]

# Expected Output: result = [('A', 'Pass', 18), ('A', 'Failed', 4), ('B', 'Pass', 10), ('B', 'Failed', 3) 

我还能使用这个代码吗??? 使用此代码作为我的参考

from collections import defaultdict

d = defaultdict(int)
for letter, status, value in samplelist:
    d[(letter, status)] += value
res = [key + (val,) for key, val in d.items()] # convert to required format
print(res) 

您可以使用带有 if 条件的基本 for 循环:

>>> result = [tuple(l1[:2]) + tuple([l1[-1] - l2[-1]]) for l1 in samplelist1 for l2 in samplelist2 if l1[:2]==l2[:2]]

或使用pandas:

>>> df1 = pd.DataFrame(samplelist1, columns=['letter', 'status', 'value'])
>>> df2 = pd.DataFrame(samplelist2, columns=['letter', 'status', 'value'])
>>> df = df1.merge(df2, left_on=['letter', 'status'], right_on=['letter', 
'status']).dropna()
>>> df['value'] = df['value_x'] - df['value_y']
>>> df.head()
  letter  status  value_x  value_y  value
0      A    Pass       20        2     18
1      A  Failed        5        1      4
2      B  Failed        5        2      3

您当前的代码将无法运行,因为它使用 samplelist,但您的数据仅包含 samplelist1samplelist2。我假设这是一个错误,并且您忘记包含迭代示例列表的循环。

无论如何,我认为您不需要 defaultdict。就是遍历[=​​14=],将值设置到字典中,然后遍历samplelist2,从字典中减去值

samplelist1 = [('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass', 10), ('B', 'Failed', 5) ]

samplelist2 = [('A', 'Pass', 2), ('A', 'Failed', 1), ('B', 'Failed', 2)]

d = {}
for x, y, z in samplelist1:
    d[x, y] = z

for x, y, z in samplelist2:
    d[x, y] -= z

result = [(k1, k2, v) for (k1, k2), v in d.items()]

print(result)

如果我们真的想使用 defaultdict,我们可以修改您的方法,首先收集列表中的项目,然后从第二项中减去第一项(如果存在多个元素):

from collections import defaultdict

samplelist1 = [('A', 'Pass', 20), ('A', 'Failed', 5), ('B', 'Pass', 10), ('B', 'Failed', 5) ]

samplelist2 = [('A', 'Pass', 2), ('A', 'Failed', 1), ('B', 'Failed', 2)]

d = defaultdict(list)
for samplelist in (samplelist1, samplelist2):
    for x, y, z in samplelist:
        d[x, y].append(z)

result = [(k1, k2, v[0] - v[1] if len(v) > 1 else v[0]) for (k1, k2), v in d.items()]

print(result)

输出:

[('A', 'Pass', 18), ('A', 'Failed', 4), ('B', 'Pass', 10), ('B', 'Failed', 3)]