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

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)]

希望你得到了想要的代码, 我的评论很有道理。☺️

欢迎随时提问...!

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 说的对我修改了一下