我想要合并具有相同初始第一个元素的子列表,但不是一个接一个地添加其他值,而是要替换它们为None的值。我有一个包含子列表的矩阵,每个子列表包含7个值:元素的编号,分数a,分数B,分数C,分数D,分数E,分数f。到目前为止,每个子列表只有一个值(即使不同的子列表是相同的),但我想合并包含相同元素不同分数的子列表。
我
sub_lists = [(1,None,None,12,None,None,None),
(2,67,None,None,None,None,None),
(2,None,None,83,None,None,None),
...]
因此,对于每个子列表,只有1个分数表示,而其他分数为空。我要找的结果是
sub_lists = [(1,None,None,12,None,None,None),
(2,67,None,83,None,None,None),
...]
我试过的是
res = []
for sub in sub_lists:
if res and res[-1][0] == sub[0]:
res[-1].extend(sub[1:])
else:
res.append([ele for ele in sub])
res = list(map(tuple, res))
但这只是将值一个接一个地相加,结果是
sub_lists = [(1,None,None,12,None,None,None),
(2,67,None,None,None,None,None,None,None,83,None,None,None),
...]
有人知道怎么帮我吗?
adam-smooch
我想他是对的
sub_lists=[
(1,None,None,12,None,None,None),
(2,67,None,None,None,None,None),
(2,None,None,83,None,None,None)
]
def my_combine(l1, l2):
l1 = list(l1)
l2 = list(l2)
for i in range(len(l1)):
if l1[i] is None:
l1[i] = l2[i]
return l1
results = dict()
for sl in sub_lists:
if sl[0] not in results:
results[sl[0]] = sl[1:]
else:
results[sl[0]] = my_combine(results[sl[0]], sl[1:])
print(results)
# desired outcome.
# sub_lists=[
# (1,None,None,12,None,None,None),
# (2,67,None,83,None,None,None)
# ]
我认为@Adam Smooch是对的,我稍微修改了一下
由于子列表的第一个数字在末尾是唯一的,因此您可以使用字典。
所以要这样做:
def my_combine(l1, l2):
l1 = list(l1)
for i in range(len(l1)):
if l1[i] is None:
l1[i] = l2[i]
return tuple(l1)
results = dict()
for sl in sub_lists:
if sl[0] not in results:
results[sl[0]] = sl[1:]
else:
results[sl[0]] = my_combine(results[sl[0]], sl[1:])
sub_lists=[(1,None,None,12,None,None,None),(2,67,None,None,None,None,None),(2,None,None,83,None,None,None)]
res = [] #resultant matrix
for sub in sub_lists:
if res and res[-1][0] == sub[0]:
valid = [] # let "valid" valid sublist that can be e added in resultant matrix.
valid.append(res[-1][0]) # we will add the the first element of last sublist of resultant matrix, and rest of the elements of sub list of "sub_lists"
valid.extend(sub[1:])
res[-1] = valid
print(sub)
else:
res.append([ele for ele in sub])
res = list(map(tuple, res))
print(res)
# desired outcome.
# sub_lists=[(1,None,None,12,None,None,None),(2,67,None,83,None,None,None)]
希望你得到了理想的代码,我的评论是有意义的☺️
请随便问任何问题…!