Конвертировать список для установки на основе дубликата только определенных значений кортежа - PullRequest
3 голосов
/ 01 апреля 2019

Как правило, преобразование списка в набор просто, как показано ниже:

a = [1,2,3,1]
set_a = set(a)    # set([1, 2, 3])

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

a = [(1,"a1"), (2,"b2"), (3, "c3"), (1, "d4")]
set_a = some_magic(a)

# 1) set_a = set([(1,"a1"), (2,"b2"), (3, "c3")]) or
# 2) set_a = set([(1, "d4"), (2,"b2"), (3, "c3")])
# Both (1) or (2) are acceptible outputs.

Есть ли какой-нибудь трюк с одной строкой, который я мог бы использовать вместо функции some_magic, упомянутой выше?

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

Ответы [ 4 ]

5 голосов
/ 01 апреля 2019

попробуйте это:

set(dict(a).items())

dict(a) превратит список в словарь, в котором ключи перезаписываются при каждом появлении

.items() извлекает каждую пару ключ-значение вdict_items список кортежей

set() превращает его в набор, который вы хотите

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

0 голосов
/ 01 апреля 2019

вы можете преобразовать в словарь, чтобы избавиться от дубликатов

set(dict(a).items())

{(1, 'd4'), (2, 'b2'), (3, 'c3')}
0 голосов
/ 01 апреля 2019
set_a = set(
    {x[0]: x for x in a}.values()
)
0 голосов
/ 01 апреля 2019

Использование списка:

a = [(1,"a1"), (2,"b2"), (3, "c3"), (1, "d4")]
seen = set()
print([x for x in a if x[0] not in seen and not seen.add(x[0])])

ВЫХОД :

[(1, 'a1'), (2, 'b2'), (3, 'c3')]

РЕДАКТИРОВАТЬ :

Использование диктов:

print({x[0]: x for x in a}.values())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...