Другой способ взглянуть на это: Используются 64 бита для представления чисел. Как следствие, не может быть представлено более 2 ** 64 = 18 446 744 073 709 551 616 различных чисел.
Тем не менее, Math говорит, что существует уже бесконечное число десятичных знаков между 0 и 1. IEE 754 определяет кодировку для эффективного использования этих 64 бит для гораздо большего количества пробелов плюс NaN и +/- Infinity, поэтому есть пробелы между точно представленными числами, заполненными числами, только приближены.
К сожалению, 0,3 сидит в промежутке.
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))
Если вы хотите его на одной строке, вам придется обмануть и использовать точку с запятой. ; -)
Вы также можете попробовать этот подход сохранить ключи и значения в другом списке, а затем использовать метод 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'}
Вы можете легко использовать это понимание:
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]
Мне также очень интересно иметь однострочный для этого преобразования, поскольку такой список является инициализатором по умолчанию для хэширования в Perl.
Исключительно полный ответ приведен в этом потоке -
Mine one Я новичок в Python), используя Python 2.7 Generator Expressions , будет:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
попробуйте ввести код:
>>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
>>> d2
{'three': 3, 'two': 2, 'one': 1}
Я не уверен, что это 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))
Что-то, что я нахожу довольно крутым, а это то, что если ваш список состоит всего из двух элементов:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
Помните, что dict принимает любой итерабельный, содержащий итерируемый, где каждый элемент в итерабельном должен быть истребитель с двумя объектами.
Не может быть самым пифоническим, но
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
Вы также можете сделать это так (строка для преобразования здесь, а затем переход в словарь)
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
Вы можете сделать это довольно быстро, не создавая дополнительные массивы, поэтому это будет работать даже для очень больших массивов:
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
#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
b[v] = c
c+=1
print b
`