Как преобразовать строковые значения из словаря в типы данных int / float? - PullRequest
22 голосов
/ 15 марта 2011

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

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

Спасибо.

Ответы [ 6 ]

38 голосов
/ 15 марта 2011

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

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

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

21 голосов
/ 15 марта 2011
for sub in the_list:
    for key in sub:
        sub[key] = int(sub[key])

Дает ему приведение типа int, а не строки.

4 голосов
/ 15 марта 2011

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

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

1 голос
/ 16 марта 2011

Для обработки возможности 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}]

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

0 голосов
/ 28 октября 2012
  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
0 голосов
/ 15 марта 2011

Если бы вы выбрали решение, действующее «на месте», вы можете взглянуть на это:

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

Кстати, порядок ключей не сохраняется, потому что так работают стандартные словари, т.е.без понятия заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...