Как тщательно искать в списке-словаре, чтобы получить правильные результаты - PullRequest
0 голосов
/ 21 мая 2018

Это мой код:

dicto = [{100: 1, 90: 2, 80: 3, 70: 4}, {100: 1, 90: 2, 80: 3}, {105: 1, 100: 2, 90: 3, 80: 4}]
listo = [70,80,105]
track = []
for y in dicto:
    for x in listo:
        try:
           track.append(y[x])
        except KeyError:
           pass
print(track)

То, что я пытаюсь сделать, это использовать числа в 'listo' в качестве ключей, чтобы получить правильные значения.Первый номер в списке можно найти только в первом словаре в dicto.Второе число в списке можно найти только во втором словаре в dicto, но не в первом или третьем словаре.Третье число в листе также можно искать только в третьем словаре в dicto, а не в других.

Вывод должен быть таким:

[4,3,1]

Но мой код возвращается:

[4,3,3,4,1]

Как я могу исправить свой код, чтобы получить правильный вывод в Python 3.x

Ответы [ 5 ]

0 голосов
/ 21 мая 2018

Мы можем выполнить циклы for, чтобы перебирать каждый словарь в списке словарей.Ниже приведен пример:

dicto = [{100: 1, 90: 2, 80: 3, 70: 4}, {100: 1, 90: 2, 80: 3}, {105: 1, 100: 2, 90: 3, 80: 4}]

listo = [70, 80, 105]
track = []

first_dict = dicto[0]
second_dict = dicto[1]
third_dict = dicto[2]

for key, value in first_dict.items():
     if key == listo[0]:
        track.append(value)

for key, value in second_dict.items():
     if key == listo[1]:
         track.append(value)

for key, value in third_dict.items():
     if key == listo[2]:
         track.append(value)



print(track)

Вот ваш вывод:

[4, 3, 1]

Мы создаем три переменные, которые хранят каждый из dicts, и если ключ dict соответствует индексу, который мыищем в списке, который соответствует 70, 80 или 105 [индекс 0, 1 или 2], затем добавляем его в список треков.

0 голосов
/ 21 мая 2018

Попробуйте,

In [4]: [j.get(i) for i,j in zip(listo,dicto)]
Out[4]: [4, 3, 1]

Если значение не существует в словаре, будет возвращено значение None.

Другой пример значения, а не выходы.

In [5]: dicto = [{100: 1, 90: 2, 80: 3, 71: 4}, {100: 1, 90: 2, 80: 3}, {105: 1, 100: 2, 90: 3, 80: 4}]
   ...: listo = [70,80,105]
   ...: 

In [6]: [j.get(i) for i,j in zip(listo,dicto)]
Out[6]: [None, 3, 1]
0 голосов
/ 21 мая 2018
track = [dicto[index].get(value,None) for index,value in enumerate(listo)]
track = [item for item in track if item is not None]
print(track)
# [4, 3, 1]

Это просто проверяет ключ-значение только для определенного индекса.Без понимания списка,

track = []
for index,value in enumerate(listo):
    val = dicto[index].get(value,None)
    if val is not None:
        track.append(val)
print(track)
0 голосов
/ 21 мая 2018

это должно работать:

track = []
for index, element in enumerate(listo):
    if element in dicto[index]:
        track.append(dicto[index][element])
print(track)

отпечатки:

[4, 3, 1]
0 голосов
/ 21 мая 2018

Вы можете использовать zip.

dicto = [{100: 1, 90: 2, 80: 3, 70: 4}, {100: 1, 90: 2, 80: 3}, {105: 1, 100: 2, 90: 3, 80: 4}]
listo = [70,80,105]

track = []
for key, d in zip(listo, dicto):
    try:
        track.append(d[key])
    except KeyError:
        pass

print(track)
# [4, 3, 1]

Если вы хотите None в качестве значения, если ключ отсутствует, вы можете использовать это:

track = [d.get(key) for key, d in zip(listo, dicto)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...