通过替换空值合并具有相同初始元素的子列表



我想要合并具有相同初始第一个元素的子列表,但不是一个接一个地添加其他值,而是要替换它们为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)]

希望你得到了理想的代码,我的评论是有意义的☺️

请随便问任何问题…!

最新更新