Как вы перепроверяете словарь со списком в Python? - PullRequest
1 голос
/ 28 июня 2011

скажи, у меня есть список

list: [keith, roger, david], [5, nobody, 31], [attack, thomas, 4]

и словарь

dictionary: '55': <Trachea>, 'Roger': <Bert>

Я хочу удалить элементы в словаре, которые не соответствуют ВТОРОЙ части списка списков. В этом примере я бы хотел избавиться от «55», но не «Роджер»:. Спасибо!

Ответы [ 5 ]

5 голосов
/ 28 июня 2011
#!/usr/bin/python3

# myList = [['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
# myDict = {'55': '...', 'roger': '...'}

secondElements = {x[1] for x in myList}

filteredDict = {k:v for k,v in myDict.items() if (k in secondElements)}

print(filteredDict)
# prints: {'roger': '...'}

Есть более быстрые способы сделать это, но создание набора secondElements ускорит запросы и увеличит время O(1). Я отредактировал ваш список, потому что были проблемы с чувствительностью к регистру, но вы также можете использовать (k.lower() in secondElements).

2 голосов
/ 28 июня 2011

OR

seconds = set(x[1] for x in d)
dict((k,v) for k,v in dd.iteritems() if k.lower() in seconds)

Отредактировано, чтобы не создавать список каждый раз

0 голосов
/ 28 июня 2011

>>> dict_ = {'Roger': 'Bert', 55: 'trachea'}
a=[['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
>>> def delete(x):<br> ... del dict_[x]
>>> map(lambda x: delete(x),filter(lambda x:x not in a[1],dict_))

0 голосов
/ 28 июня 2011

Создайте промежуточный набор и проверьте его:

# create set to check against
seconds = set(x[1] for x in list_of_lists)

# remove matching keys
for k in my_dict.keys():
  if k not in seconds:
     delete my_dict[k]

Easy. Работает за O (N) время, с O (N) хранилищем. Обратите внимание, что в вашем примере, заглавные буквы не будут совпадать ('roger'! = 'Roger')

0 голосов
/ 28 июня 2011
nested = [['keith', 'roger', 'david'], [5, 'nobody', 31], ['attack', 'thomas', 4]]
seconds = [row[1] for row in nested]
d = {'55': 'Trachea', 'Roger': 'Bert'}
d = dict(((key, val) for (key, val) in d.items() if key.lower() in seconds))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...