сравнить два списка диктов в Python 2 - PullRequest
0 голосов
/ 05 мая 2019

Я хочу сравнить два списка словарей в Python, у меня есть список, отправленный из внешнего интерфейса, и результат запроса, сохраненный в одной и той же функции, поэтому все, что я хочу, это сравнить оба списка с ключом barcode иесли они совпадают, я хочу добавить name из второго словаря в первый

, например:

data_from_frontend = [
    { barcode: '1', name_en: 'milk' },
    { barcode: '2', name_en: 'water' },
    { barcode: '3', name_en: 'cheese' },
    { barcode: '10', name_en: 'pepsi' },
]
result_from_query = [
    { barcode: '1', name: 'PID012343' },
    { barcode: '2', name: 'PID123454' },
    { barcode: '10', name: 'PID123432' },
]

Я хочу сравнить оба списка и по barcode и если они совпадают, я хочу объединить пару обеих переменных в новую + добавить одну, которая не соответствует другому списку, так что результатом будут две новые переменные с [matched + name] и not_found,как мне этого добиться?

Вот что я пробовал

equal = []
not_equal = []
no_barcode = []
x = [ { "age": "22" }, { "name": "John Doe" }, { "name": "Jane Doe" }, { "name": "Doctor" }, { "name": "Engineer" } ]
y = [ { "name": "Engineer" }, { "name": "Jane Doe" }, { "name": "Doctor" } ]
x_sort = sorted(x, key=lambda k: ("name" not in k, k.get("name", None)))
y_sort = sorted(y, key=lambda k: ("name" not in k, k.get("name", None)))
print(y_sort)
for x_val in x_sort:
    if "name" not in x_val.keys():
        no_barcode.append(x_val)
    else:
        for y_val in y_sort:
            if x_val["name"] == y_val["name"]:
                equal.append(x_val)
                mapped = map(lambda k: k["name"], y_sort)
                if x_val["name"] not in mapped:
                    not_equal.append(x_val)
print('equal')
print(equal)
print('not equal')
print(not_equal)

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Прежде всего вы должны исправить свои ключи и заключить их в кавычки.

Затем вы можете использовать выражение генератора , чтобы найти элементы, например:

print('initial dict:')
pprint.pprint(data_from_frontend)

for item in result_from_query:
    item_found = next((i for i in data_from_frontend if i['barcode'] == item['barcode']), False)
    if item_found:
        item_found['name'] = item['name']

print('dict after search:')
pprint.pprint(data_from_frontend)

будет выдавать:

initial dict:
[{'barcode': '1', 'name_en': 'milk'},
 {'barcode': '2', 'name_en': 'water'},
 {'barcode': '3', 'name_en': 'cheese'},
 {'barcode': '10', 'name_en': 'pepsi'}]
dict after search:
[{'barcode': '1', 'name': 'PID012343', 'name_en': 'milk'},
 {'barcode': '2', 'name': 'PID123454', 'name_en': 'water'},
 {'barcode': '3', 'name_en': 'cheese'},
 {'barcode': '10', 'name': 'PID123432', 'name_en': 'pepsi'}]

Использование False в генераторе позволит избежать ошибок при поиске по значению штрих-кода, отсутствующего в целевом dict.

PS не забудьтеимпортируйте pprint, если хотите использовать

PPS и убедитесь, что вы можете создать новый dict вместо изменения существующего, используя ту же логику

0 голосов
/ 05 мая 2019

Ваши результаты сопоставления штрих-кодов могут быть получены следующим образом.

barcode = 'barcode'
name_en = 'name_en'
name = 'name'

matching_result = data_from_frontend[:] #get a copy of front end data to use as the output

for i in range(len(data_from_frontend)):
    for j in range(len(result_from_query)):
        if(data_from_frontend[i][barcode] == result_from_query[j][barcode]):
            matching_result[i][name] = result_from_query[j][name]
            break

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