Использование списка со списком словарей - PullRequest
0 голосов
/ 27 марта 2019

У меня есть список словарей (LDICT) и список строк (LS). Я хотел бы проверить, чтобы убедиться, что элементы в LS не являются ключами ни в одном из словарей в LDICT. Если они есть, я хотел бы удалить этот элемент из LS.

Я нашел способ сделать это для циклов, но это уродливо, и я изо всех сил пытаюсь понять, как я могу добиться этого, используя понимание списка.

См. Код ниже для примера использования цикла for:

for item in LDICT:
    for k, v in item.iteritems():
        if k in LS:
            LS.remove(k)

Ответы [ 3 ]

3 голосов
/ 27 марта 2019

Используйте any() для проверки каждого слова в LS:

[k for k in LS if not any((k in t) for t in LDICT)]
1 голос
/ 27 марта 2019

Создайте комбинированные наборы всех ключей со всеми значениями LDICT и вычтите их из набора LS:

(длинный путь)

LDICT = [ {i:"" for i in range(k,k+20,3)} for k in range(0,100,20)]

LS = [x for x in range(100) if x%4 == 0]
print(LDICT)
print(LS)

all_keys = set(x for d in LDICT for x in d)
print(all_keys)

cleaned_keys = set(LS)-all_keys
print(cleaned_keys)

Вывод:

# LDICT
[{0: '', 3: '', 6: '', 9: '', 12: '', 15: '', 18: ''}, 
 {20: '', 23: '', 26: '', 29: '', 32: '', 35: '', 38: ''}, 
 {40: '', 43: '', 46: '', 49: '', 52: '', 55: '', 58: ''}, 
 {60: '', 63: '', 66: '', 69: '', 72: '', 75: '', 78: ''}, 
 {80: '', 83: '', 86: '', 89: '', 92: '', 95: '', 98: ''}]

 # LS
[0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 
 68, 72, 76, 80, 84, 88, 92, 96]

 # all_keys
 {0, 3, 6, 9, 12, 15, 18, 20, 23, 26, 29, 32, 35, 38, 40, 43, 46, 49, 52, 55, 58, 60,
  63, 66, 69, 72, 75, 78, 80, 83, 86, 89, 92, 95, 98}

 # cleaned_keys
 {64, 96, 4, 36, 68, 8, 44, 76, 16, 48, 84, 24, 56, 88, 28}

Вам просто нужно составить список из cleaned_keys.

Доку:

1 голос
/ 27 марта 2019
forbidden_keys = set(key for dct in LDICT for key in dct)
filtered_list = [item for item in LST if item not in forbidden_keys]
...