Существует ли лучший способ преобразовать список в словарь в Python с ключами, но никакими значениями?

Согласно Методы Файловых Объектов , самый простой способ конвертировать текстовый файл в list:

with open('file.txt') as f:
    my_list = list(f)

Старый ответ:

Использование with и readlines():

with open('file.txt') as f:
    lines = f.readlines()

Если вам не нужно закрывать файл, эта однострочная работа работает:

lines = open('file.txt').readlines()

традиционный способ:

f = open('file.txt') # Open file on read mode
lines = f.read().split("\n") # Create a list containing all lines
f.close() # Close file

6
задан Peter Mortensen 9 October 2015 в 10:13
поделиться

6 ответов

Используйте ] dict.fromkeys :

>>> my_list = [1, 2, 3]
>>> dict.fromkeys(my_list)
{1: None, 2: None, 3: None}

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

>>> my_list = [1, 2, 3]
>>> dict.fromkeys(my_list, 0)
{1: 0, 2: 0, 3: 0}

Из документации:

a.fromkeys (seq [, словарь с ключами из seq и значения установлены в значение.

dict.fromkeys - это метод класса, возвращает новый словарь. стоимость по умолчанию - Нет. Новое в версии 2.3.

23
ответ дан 8 December 2019 в 02:09
поделиться

Вы можете использовать набор вместо dict:

>>> myList=['a','b','c','d']
>>> set(myList)
set(['a', 'c', 'b', 'd'])

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

15
ответ дан 8 December 2019 в 02:09
поделиться

Вы можете использовать понимание списка:

my_list = ['a','b','c','d']
my_dict = dict([(ele, None) for ele in my_list])
1
ответ дан 8 December 2019 в 02:09
поделиться

Чтобы ответить на беспокойство исходного вопроса о производительности (для поиска в dict vs set ), как ни странно, dict lookups может быть на минуту быстрее (в Python 2.5.1 на моем довольно медленном ноутбуке), например, при условии, что половина поисков не удалась, а половина - успешно. Вот как это происходит:

$ python -mtimeit -s'k=dict.fromkeys(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.236 usec per loop
$ python -mtimeit -s'k=set(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.265 usec per loop

каждая проверка выполняется несколько раз, чтобы убедиться, что они повторяемы. Так что, если эти 30 наносекунд или меньше на медленном ноутбуке являются абсолютно критическим узким местом, возможно, стоит обратиться к неясному dict.fromkeys решению, а не к простому, очевидному, удобочитаемому и явно правильному set (необычно - почти всегда в Python простое и прямое решение также имеет преимущества в производительности).

Конечно,

5
ответ дан 8 December 2019 в 02:09
поделиться

А вот довольно неправильный и неэффективный способ сделать это с помощью карты:

>>> d = dict()
>>> map (lambda x: d.__setitem__(x, None), [1,2,3])
[None, None, None]
>>> d
{1: None, 2: None, 3: None}
1
ответ дан 8 December 2019 в 02:09
поделиться

Может быть, вы можете использовать itertools:

>>>import itertools
>>>my_list = ['a','b','c','d']
>>>d = {}
>>>for x in itertools.imap(d.setdefault, my_list): pass
>>>print d
{'a': None, 'c': None, 'b': None, 'd': None}

Для больших списков, может быть, это очень хорошо: P

1
ответ дан 8 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: