Как вы меняете список целых чисел и строк в список целых чисел и чисел в Python? - PullRequest
0 голосов
/ 22 июля 2011

У меня длинный список с кучей списков:

[0, ['0.2000', '0.2000', '3.0000', '0.5000']]

Как сделать, чтобы '...' плавало и сохраняло целые числа (0) целыми числами?

Я пробовал NumPy, но это не работает для меня numpy.array (список, numpy.float)

Я не против, если целые числа тоже являются числами с плавающей запятой.

Ответы [ 5 ]

3 голосов
/ 22 июля 2011

Я бы сделал что-то вроде этого:

newlist = [[element[0], [float(e) for e in element[1]] for element in oldlist]

element[0] - это целое число, оставленное как есть, element[1] - список строк, которые преобразуются в числа с плавающей точкой в ​​понимании внутреннего списка.

1 голос
/ 22 июля 2011

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

l1 = [0, ['0.2000', '0.2000', '3.0000', '0.5000']]
l2 = [x if type(x) is int else map(float, x) for x in l1]

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

[0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]]
0 голосов
/ 22 июля 2011

Если вы хотите сгладить и вложенные списки ...

import types

def process(l):
    for item in l:
        if isinstance(item, types.ListType):
            for item in process(item):
                yield float(item)
        else:
            yield float(item)

>>> l = [0, 1, 2, [3, 4, '5.000'], ['6.01', 7, [8, 9]]]
>>> list( process(l) )
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.01, 7.0, 8.0, 9.0]
0 голосов
/ 22 июля 2011

просто

li = [0, ['0.2000', '0.2000', '3.0000', '0.5000']]
print li

li[1] = map(float,li[1])
print li

РЕДАКТИРОВАТЬ 1

Если xyze :

xyze = [[0, ['0.2000', '0.2000', '3.000' , '0.5000']],
        [9, ['0.1450', '0.8880', '3.000' , '0.4780']],
        [4, ['5.0025', '7.2000', '12.00' , '6.5013']]]

сделать

print '\n'.join(map(str,xyze))
print

for el in xyze:
    el[1] = map(float,el[1])

print '\n'.join(map(str,xyze))

результат

[0, ['0.2000', '0.2000', '3.000', '0.5000']]
[9, ['0.1450', '0.8880', '3.000', '0.4780']]
[4, ['5.0025', '7.2000', '12.00', '6.5013']]

[0, [0.2, 0.2, 3.0, 0.5]]
[9, [0.145, 0.888, 3.0, 0.478]]
[4, [5.0025, 7.2, 12.0, 6.5013]]
0 голосов
/ 22 июля 2011

Вот как вы можете сделать это с помощью numpy:

In [96]: l1=[0, ['0.2000', '0.2000', '3.0000', '0.5000']]

In [97]: l2=np.array(tuple(l1),dtype=[('f1','int'),('f2','float',4)])

In [98]: l2
Out[98]: 
array((0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]), 
      dtype=[('f1', '<i4'), ('f2', '<f8', 4)])

Если ваш фактический список выглядит примерно так:

In [99]: l3=[0, ['0.2000', '0.2000', '3.0000', '0.5000'], 1, ['.1','.2','.3','0.4']]

тогда вы можете использовать идиому группировщика zip(*[iter(l3)]*2)), чтобы сгруппировать каждые 2 элемента в кортеж:

In [104]: zip(*[iter(l3)]*2)
Out[104]: [(0, ['0.2000', '0.2000', '3.0000', '0.5000']), (1, ['.1', '.2', '.3', '0.4'])]

и передайте это np.array:

In [105]: l4=np.array(zip(*[iter(l3)]*2),dtype=[('f1','int'),('f2','float',4)])

In [106]: l4
Out[106]: 
array([(0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]),
       (1, [0.10000000000000001, 0.20000000000000001, 0.29999999999999999, 0.40000000000000002])], 
      dtype=[('f1', '<i4'), ('f2', '<f8', 4)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...