如何在具有多个条件的单独元组列表中减去最后一个 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
,但您的数据仅包含 samplelist1
和 samplelist2
。我假设这是一个错误,并且您忘记包含迭代示例列表的循环。
无论如何,我认为您不需要 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)]
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
,但您的数据仅包含 samplelist1
和 samplelist2
。我假设这是一个错误,并且您忘记包含迭代示例列表的循环。
无论如何,我认为您不需要 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)]