всеобъемлющий дикт с несколькими или повторяющимися значениями в python3 - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть обширный список с кортежами пар.Это выглядит так:

travels =[(passenger_1, destination_1), (passenger_2, destination_2),(passenger_1, destination_2)...]

И так далее.Пассажиры и пункты назначения могут повторяться, и даже один и тот же кортеж пассажира может повторяться.Я хочу сделать исчерпывающую подсказку, в которой ключ каждого пассажира и стоимость его наиболее повторяющегося пункта назначения

Моя первая попытка была такой:

dictionary = {k:v for k,v in travels}

, но каждый ключ перезаписывает последний.Я надеялся получить несколько значений для каждого ключа, чтобы затем я мог рассчитывать для каждого ключа.Затем я попытался так:

dictionary = {k:v for k,v in travels if k not in dictionary else dictionary[k].append(v)}

, но я не могу назвать словарь в его собственном определении.Любые идеи о том, как я могу это сделать?Важно, чтобы это было сделано всесторонне, а не петлями.

1 Ответ

0 голосов
/ 15 сентября 2018

Вот как это можно сделать с помощью цикла for:

result = dict()
for passenger, destination in travels:
    result.setdefault(passenger, list()).append(destination)

result - это единственный словарь, в котором ключи - это пассажиры, а значения - это списки с пунктами назначения.

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

EDIT.

Если вы хотите (или должны) использовать выражение для понимания, независимо от того, что вы можете сделать это следующим образом (2 понимания и без явных циклов):

result = {
    passenger: [destination_
                for passenger_, destination_
                in travels
                if passenger_ == passenger]
    for passenger, dummy_destination
    in travels}

Это плохой алгоритм, чтобы получить то, что вы хотите. Его эффективность составляет O (n ^ 2), а эффективность первого метода - O (n).

...