Поверните непрерывные элементы списка строк в пару с ключом: значение (Python) [duplicate]

Другой способ взглянуть на это: Используются 64 бита для представления чисел. Как следствие, не может быть представлено более 2 ** 64 = 18 446 744 073 709 551 616 различных чисел.

Тем не менее, Math говорит, что существует уже бесконечное число десятичных знаков между 0 и 1. IEE 754 определяет кодировку для эффективного использования этих 64 бит для гораздо большего количества пробелов плюс NaN и +/- Infinity, поэтому есть пробелы между точно представленными числами, заполненными числами, только приближены.

К сожалению, 0,3 сидит в промежутке.

139
задан Mateusz Piotrowski 27 April 2016 в 14:25
поделиться

11 ответов

b = dict(zip(a[::2], a[1::2]))

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

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

В Python 3 вы может также использовать понимание dict, но по иронии судьбы я думаю, что самый простой способ сделать это будет с range() и len(), который обычно будет запахом кода.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Итак, iter()/izip() по-прежнему, вероятно, самый Pythonic в Python 3, хотя, как отмечает EOL в комментарии, zip() уже ленив в Python 3, поэтому вам не нужно izip().

i = iter(a)
b = dict(zip(i, i))

Если вы хотите его на одной строке, вам придется обмануть и использовать точку с запятой. ; -)

211
ответ дан coldspeed 24 August 2018 в 08:27
поделиться

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

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
0
ответ дан Ayodhyankit Paul 24 August 2018 в 08:27
поделиться

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

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

Это эквивалентно циклу for ниже:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]
12
ответ дан Chris Arena 24 August 2018 в 08:27
поделиться

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

Исключительно полный ответ приведен в этом потоке -

Mine one Я новичок в Python), используя Python 2.7 Generator Expressions , будет:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

37
ответ дан Community 24 August 2018 в 08:27
поделиться

попробуйте ввести код:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}
0
ответ дан Joey Harwood 24 August 2018 в 08:27
поделиться

Я не уверен, что это pythonic, но, похоже, работает

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))
0
ответ дан Manu 24 August 2018 в 08:27
поделиться

Что-то, что я нахожу довольно крутым, а это то, что если ваш список состоит всего из двух элементов:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

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

8
ответ дан rix 24 August 2018 в 08:27
поделиться

Не может быть самым пифоническим, но

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
3
ответ дан sahhhm 24 August 2018 в 08:27
поделиться

Вы также можете сделать это так (строка для преобразования здесь, а затем переход в словарь)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list
1
ответ дан Stefan Gruenwald 24 August 2018 в 08:27
поделиться

Вы можете сделать это довольно быстро, не создавая дополнительные массивы, поэтому это будет работать даже для очень больших массивов:

dict(izip(*([iter(a)]*2)))

Если у вас есть генератор a, еще лучше:

dict(izip(*([a]*2)))

Вот краткое изложение:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary
2
ответ дан topkara 24 August 2018 в 08:27
поделиться
#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
    b[v] = c
    c+=1
print b

`

-1
ответ дан XiaoSI Lu 24 August 2018 в 08:27
поделиться
Другие вопросы по тегам:

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