通过替换空值合并具有相同初始元素的子列表
Merging sublists with same initial element by substituting null values
我想合并具有相同初始第一个元素的子列表,但我不想一个接一个地添加其他值,而是想在原处替换值 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),
...]
有人知道如何帮助我吗?
由于子列表的第一个数字在最后是唯一的,您可以使用字典。
所以做这样的事情:
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)]
希望你得到了想要的代码,
我的评论很有道理。☺️
欢迎随时提问...!
我认为他是对的
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 说的对我修改了一下
我想合并具有相同初始第一个元素的子列表,但我不想一个接一个地添加其他值,而是想在原处替换值 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),
...]
有人知道如何帮助我吗?
由于子列表的第一个数字在最后是唯一的,您可以使用字典。
所以做这样的事情:
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)]
希望你得到了想要的代码, 我的评论很有道理。☺️
欢迎随时提问...!
我认为他是对的
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 说的对我修改了一下