добавление пустой строки при объединении двух списков — Python

#python #python-2.7 #list

#python #python-2.7 #Список

Вопрос:

У меня есть 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]]
  

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

Комментарии:

1. В вашем примере у вас есть пробел в вашей «пустой строке», и, таким образом, это не пустая строка, а строка, состоящая из пробела. Вы получаете пустую строку с ""

2. @yatu: Нет, проверяйте только первый элемент. если в подсписке нет второго элемента, к нему следует добавить пустую строку (пробел, который указан как 1 элемент в этом подсписке)

3. Вам нужно перебирать основной список, а не подсписок.

Ответ №1:

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

 for list in result:
    while len(list) < max(len(l) for l in result):
        list.append(" ")
  

Ответ №2:

Вы могли бы просто просмотреть список результатов и проверить, где общее количество ваших элементов равно 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
  

Комментарии:

1. Это не может быть сделано таким образом, поскольку я привел пример списка в вопросе. элементы в подсписке больше и не могут быть подсчитаны.

2. Я добавил обновление для вашего редактирования. Это добавляет пару строк в ваш код, чтобы он работал.

Ответ №3:

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

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

Комментарии:

1. вложенных элементов mainlist больше, чем 2. как я привел пример, подобный этому. теперь я также изменил вопрос. вот почему я конвертирую 1 элемент в качестве ключа и добавляю элементы.

2. хорошо, это обновление должно сработать … для любого кортежа, состоящего более чем из двух, используется рекурсивное приведение и добавляет его в результат как extend . для кортежей из двух используйте прямое приведение dict и добавляет к результатам с помощью append .

Ответ №4:

Другой вариант — преобразовать подсписок в 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]]