задача объединения двух списков в словарь с исключениями

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