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