Python множественное условие между двумя списками - PullRequest
0 голосов
/ 16 октября 2018

Я использую Python 3, и мне нужно проверить 3 переменные в другом списке.Я хочу напечатать данные, если username age lang отличается от другого списка

Вот мой код:

list1 = []
list2 = []

list1.append({'username' : 'alice', 'age' : 25, 'lang' : 'IT'})
list1.append({'username' : 'carole', 'age' : 40, 'lang' : 'FR'})
list1.append({'username' : 'john', 'age' : 30, 'lang' : 'FR'})
list1.append({'username' : 'mick', 'age' : 20, 'lang' : 'US'})
list1.append({'username' : 'mick', 'age' : 30, 'lang' : 'US'})

list2.append({'username' : 'mick-c', 'age' : 30, 'lang' : 'US'})
list2.append({'username' : 'john', 'age' : 30, 'lang' : 'FR'})
list2.append({'username' : 'john-b', 'age' : 30, 'lang' : 'FR'})

for l1 in list1:
    username = l1['username']
    age = l1['age']
    lang = l1['lang']

    for l2 in list2:
        if username not in l2['username'] and l2['age'] != age and l2['lang'] != lang:
            print(str(username) + ' ' + str(age) + ' ' + str(lang))

Вывод:

alice 25 IT
alice 25 IT
alice 25 IT
carole 40 FR
mick 20 US
mick 20 US

И мой ожидаемый результат был:

alice 25 IT
carole 40 FR
mick 20 US

Как я могу сделать так, чтобы в цикле не было дублированных данных?И есть другой способ сделать то, что я хочу, вместо использования двойных циклов?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы должны выводить запись, только если она не найдена в list2, поэтому вы должны использовать конструкцию for-else для print после того, как убедитесь, что в list2 нет записи, когда все 3 поля пропускаюттесты на равенство (а не тесты на неравенство):

for l1 in list1:
    username = l1['username']
    age = l1['age']
    lang = l1['lang']

    for l2 in list2:
        if username in l2['username'] and l2['age'] == age and l2['lang'] == lang:
            break
    else:
        print(str(username) + ' ' + str(age) + ' ' + str(lang))

Это выводит:

alice 25 IT
carole 40 FR
mick 20 US
0 голосов
/ 16 октября 2018

Вы можете использовать set для хеширования последовательности tuple элементов из одного списка.Приведенная ниже логика работает конкретно, когда имена в list2 могут иметь формат name-a, name-b и т. Д., И вас интересует только первая часть.

from operator import itemgetter

def field_getter(x):
    i, j, k = itemgetter('username', 'age', 'lang')(x)
    return i.split('-')[0], j, k

item_set = set(map(field_getter, list2))

for d in list1:
    d_fields = field_getter(d)
    if field_getter(d) not in item_set:
        print(*d_fields)

alice 25 IT
carole 40 FR
mick 20 US
0 голосов
/ 16 октября 2018

Сортировка элементов с правилом сравнения по трем полям.Одинаковые записи появятся рядом друг с другом, и одного цикла будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...