добавление пустой строки при объединении 2 списков - Python - PullRequest
0 голосов
/ 21 марта 2019

У меня есть 2 списка

mainlist=[['RD-12',12,'a'],['RD-13',45,'c'],['RD-15',50,'e']] and 
sublist=[['RD-12',67],['RD-15',65]]

, если я присоединяюсь к обоим спискам на основе условия 1-го элемента, используя приведенный ниже код

def combinelist(mainlist,sublist):
   dict1 = { e[0]:e[1:] for e in mainlist }
   for e in sublist:
      try:
         dict1[e[0]].extend(e[1:])
      except:
         pass
   result = [ [k] + v for k, v in dict1.items() ]
   return result

Его результаты аналогичны приведенным ниже

[['RD-12',12,'a',67],['RD-13',45,'c',],['RD-15',50,'e',65]]

, поскольку они не являются элементами для 'RD-13' в подсписке, я хочу пустую строку для этого.

Окончательный результат должен быть

[['RD-12',12,'a',67],['RD-13',45,'c'," "],['RD-15',50,'e',65]]

Пожалуйста, помогите мне.

Ответы [ 4 ]

1 голос
/ 21 марта 2019

Ваша проблема может быть решена с помощью цикла while для настройки длины ваших подсписков до тех пор, пока она не будет соответствовать длине самого длинного подсписка, добавив нужную строку.

for list in result:
    while len(list) < max(len(l) for l in result):
        list.append(" ")
1 голос
/ 21 марта 2019

Вы можете просто просмотреть список результатов и проверить, где общее число ваших элементов равно 2 вместо 3.

for list in lists:
    if len(list) == 2:
        list.append(" ")

ОБНОВЛЕНИЕ:

Еслив подсписке больше элементов, просто вычтите списки, содержащие «ключи» ваших списков, а затем добавьте нужную строку.

def combinelist(mainlist,sublist):
   dict1 = { e[0]:e[1:] for e in mainlist }
   list2 = [e[0] for e in sublist]
   for e in sublist:
      try:
         dict1[e[0]].extend(e[1:])
      except:
         pass
   for e in dict1.keys() - list2:
       dict1[e].append(" ")
   result = [[k] + v for k, v in dict1.items()]
   return result
0 голосов
/ 21 марта 2019

Другой вариант - преобразовать подсписок в dict, чтобы элементы были легко и быстро доступны.

sublist_dict  = dict(sublist)

Так что вы можете сделать (это изменяет mainlist):

for i, e in enumerate(mainlist):
  data: mainlist[i].append(sublist_dict.get(e[0], ""))
#=> [['RD-12', 12, 'a', 67], ['RD-13', 45, 'c', ''], ['RD-15', 50, 'e', 65]]

Или понимание списка из одной строки (оно создает новый список):

[ e + [sublist_dict.get(e[0], "")] for e in mainlist ]


Если вы хотите пропустить отсутствующий элемент:
for i, e in enumerate(mainlist):
  data = sublist_dict.get(e[0])
  if data: mainlist[i].append(data)

print(mainlist)
#=> [['RD-12', 12, 'a', 67], ['RD-13', 45, 'c'], ['RD-15', 50, 'e', 65]]
0 голосов
/ 21 марта 2019

Вы можете попробовать что-то вроде этого:

mainlist=[['RD-12',12],['RD-13',45],['RD-15',50]]
sublist=[['RD-12',67],['RD-15',65]]
empty_val = ''

# Lists to dictionaries
maindict = dict(mainlist)
subdict = dict(sublist)
result = []
# go through all keys
for k in list(set(list(maindict.keys()) + list(subdict.keys()))):
    # pick the value from each key or a default alternative
    result.append([k, maindict.pop(k, empty_val), subdict.pop(k, empty_val)])
# sort by the key
result = sorted(result, key=lambda x: x[0])

Вы можете установить пустое значение на то, что вам нужно.

ОБНОВЛЕНИЕ

В новых условиях это будет выглядеть так:

mainlist=[['RD-12',12,'a'], ['RD-13',45,'c'], ['RD-15',50,'e']]
sublist=[['RD-12',67], ['RD-15',65]]

maindict = {a:[b, c] for a, b, c in mainlist}
subdict = dict(sublist)
result = []

for k in list(set(list(maindict.keys()) + list(subdict.keys()))):
    result.append([k, ])
    result[-1].extend(maindict.pop(k, ' '))
    result[-1].append(subdict.pop(k, ' '))

sorted(result, key=lambda x: x[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...