Python: как преобразовать список значений словарей в int/float из строки?

У меня есть список словарей следующим образом:

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 } ]

Спасибо.

Ответ 1

for sub in the_list:
    for key in sub:
        sub[key] = int(sub[key])

Дает ему кастинг как int вместо строки.

Ответ 2

Должны понимать любовные списки.

[dict([a, int(x)] for a, x in b.items()) for b in list]

(замечание: только для кода Python 2 вы можете использовать "iteritems" вместо "items" )

Ответ 3

Если ваш точный формат, вы можете просмотреть список и изменить словари.

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).

Ответ 4

Чтобы обрабатывать возможность 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}]

Обратите внимание, что в любом случае это создает новый словарь списков, вместо того, чтобы модифицировать оригинал на месте (что нужно сделать по-другому).

Ответ 5

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

>>> 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, порядок ключей не сохраняется, так как работают стандартные словари, т.е. без понятия порядка.

Ответ 6

  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