Ответ 1
for sub in the_list:
for key in sub:
sub[key] = int(sub[key])
Дает ему кастинг как int вместо строки.
У меня есть список словарей следующим образом:
list = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]
Как преобразовать значения каждого словаря из списка в int/float?
Так оно и будет:
list = [ { 'a':1 , 'b':2 , 'c':3 }, { 'd':4 , 'e':5 , 'f':6 } ]
Спасибо.
for sub in the_list:
for key in sub:
sub[key] = int(sub[key])
Дает ему кастинг как int вместо строки.
Должны понимать любовные списки.
[dict([a, int(x)] for a, x in b.items()) for b in list]
(замечание: только для кода Python 2 вы можете использовать "iteritems" вместо "items" )
Если ваш точный формат, вы можете просмотреть список и изменить словари.
for item in list_of_dicts:
for key, value in item.iteritems():
try:
item[key] = int(value)
except ValueError:
item[key] = float(value)
Если у вас есть что-то более общее, тогда вам придется сделать какое-то рекурсивное обновление в словаре. Проверьте, является ли элемент словарем, если это так, используйте рекурсивное обновление. Если он может быть преобразован в float или int, преобразуйте его и измените значение в словаре. Для этого нет встроенной функции, и она может быть довольно уродливой (и непифонической, поскольку обычно требуется вызов isinstance).
Чтобы обрабатывать возможность int
, float
и пустых строковых значений, я бы использовал комбинацию понимания списка, понимания словаря и условных выражений, как показано:
dicts = [{'a': '1' , 'b': '' , 'c': '3.14159'},
{'d': '4' , 'e': '5' , 'f': '6'}]
print [{k: int(v) if v and '.' not in v else float(v) if v else None
for k, v in d.iteritems()}
for d in dicts]
# [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]
Однако словарные понятия не были добавлены в Python 2 до версии 2.7. Он может быть выполнен в более ранних версиях как одно выражение, но должен быть написан с использованием конструктора dict
, как показано ниже:
# for pre-Python 2.7
print [dict([k, int(v) if v and '.' not in v else float(v) if v else None]
for k, v in d.iteritems())
for d in dicts]
# [{'a': 1, 'c': 3.14159, 'b': None}, {'e': 5, 'd': 4, 'f': 6}]
Обратите внимание, что в любом случае это создает новый словарь списков, вместо того, чтобы модифицировать оригинал на месте (что нужно сделать по-другому).
Если вы решите, что решение действует "на месте", вы можете взглянуть на это:
>>> d = [ { 'a':'1' , 'b':'2' , 'c':'3' }, { 'd':'4' , 'e':'5' , 'f':'6' } ]
>>> [dt.update({k: int(v)}) for dt in d for k, v in dt.iteritems()]
[None, None, None, None, None, None]
>>> d
[{'a': 1, 'c': 3, 'b': 2}, {'e': 5, 'd': 4, 'f': 6}]
Btw, порядок ключей не сохраняется, так как работают стандартные словари, т.е. без понятия порядка.
newlist=[] #make an empty list
for i in list: # loop to hv a dict in list
s={} # make an empty dict to store new dict data
for k in i.keys(): # to get keys in the dict of the list
s[k]=int(i[k]) # change the values from string to int by int func
newlist.append(s) # to add the new dict with integer to the list