#python #list #dictionary
Вопрос:
Я пытаюсь объединить два списка в словарь, исключив целые числа из первого списка и строки из второго списка.
list1 = ["A","B","C","D","E" ,"F", 1 ,"G", 3 ,"H","I","J","K","L"]
list2 = [20 ,27 , "Arm","Leg", 13 , 24 ,"Head", 75 , 64 , 71 ,"Ankle", 82 , 45 , 23]
Я попытался использовать приведенный ниже код:
dictchallenge ={[x for x in list1 if isinstance(x, str)][i]: [x for x in list2 if isinstance(x, int)][i] for i in range(len([x for x in list1 if isinstance(x, int)]))}
print(dictchallenge)
Вывод кода выглядит следующим образом:
{'A': 20, 'B': 27}
Код объединяет только первые две строки из списка ключей с первыми двумя целыми числами из списка значений, мне нужно объединить все ключи в первом списке со всеми значениями во втором списке следующим образом:
{'A': 20, 'B': 27, 'E': 13, 'F': 24, 'G': 75, 'H': 71, 'J': 82, 'K': 45, 'L': 23 }
Если кто-нибудь может мне в этом помочь, спасибо.
Комментарии:
1. старайтесь не делать все в одной строке, вы просто причиняете себе боль.
2. Проверьте, что
len([x for x in list1 if isinstance(x, int)])
производит, и вы получите проблему. И, пожалуйста, не пытайтесь сохранять строки кода — этим вы вредите удобочитаемости и производительности3. Спасибо за ваш совет, я написал его в одной строке, потому что профессор поставил перед нами задачу написать самую короткую программу для этого. Я попробовал len([x для x в списке 1, если isinstance(x, str)]) и получил список ошибок из индекса
Ответ №1:
Попробуйте это:
list1 = ["A", "B", "C", "D", "E", "F", 1, "G", 3, "H", "I", "J", "K", "L"]
list2 = [20, 27, "Arm", "Leg", 13, 24, "Head", 75, 64, 71, "Ankle", 82, 45, 23]
d={}
for i in list1:
for j in list2:
if str(j).isdigit()==True and list1.index(i)==list2.index(j):
d[i]=j
print(d)
Ответ №2:
Что вы могли бы сделать, так это сначала получить индексы из обоих списков, которые вам не нужны:
>>> indexes = [i for i in range(len(list1)) if not isinstance(list1[i], str)]
>>> indexes = [i for i in range(len(list2)) if not isinstance(list2[i], int)]
Затем вы избавляетесь от ненужных элементов:
>>> clean_list1 = [list1[i] for i in range(len(list1)) if i not in indexes]
>>> clean_list2 = [list2[i] for i in range(len(list2)) if i not in indexes]
И, наконец, вы можете заархивировать оба списка:
>>> dict(zip(clean_list1, clean_list2))
{'A': 20, 'B': 27, 'E': 13, 'F': 24, 'G': 75, 'H': 71, 'J': 82, 'K': 45, 'L': 23}
Комментарии:
1. Большое спасибо за ваш совет, я думаю, что самый простой способ сделать это-использовать zip, как вы это сделали, единственная проблема в том, что профессор в колледже ставит перед собой задачу написать самую короткую программу, чтобы сделать это без использования zip.
Ответ №3:
Простой способ использовать один для цикла и проверить, имеет ли list1
ключ в виде строки и list2
значение в виде int, если да, добавьте его в дикт output
и увеличьте i
и j
.
list1 = ["A","B","C","D","E" ,"F", 1 ,"G", 3 ,"H","I","J","K","L"]
list2 = [20 ,27 , "Arm","Leg", 13 , 24 ,"Head", 75 , 64 , 71 ,"Ankle", 82 , 45 , 23]
i=0
j=0
output = {}
for i in range(len(list1)):
if isinstance(list1[i] , str):
if isinstance(list2[i] , int):
output[list1[i]] = list2[i]
j =1
i =1
print(output)
выход:
{'A': 20, 'B': 27, 'E': 13, 'F': 24, 'G': 75,
'H': 71, 'J': 82, 'K': 45, 'L': 23}