0

我有一个看起来像这样的数组:['14', '43.8303', '13', '44.8114', '16', '45.6076', '7', '45.6762', '2', '45.8241', '18', '46.0605', '8', '47.7897', '4', '53.4238', '1', '53.5724', '15', '54.0245', '17', '54.1073', '9', '58.2705', '3', '61.0334', '5', '62.0799', '12', '70.6712', '11', '81.171', '10', '196.992', '6', '314.895']

是否可以将偶数位置的元素转换为int奇数位置的元素float

我试过这样:

for i in range(36):
        if i%2==0:
            items[i] = map(int, items[i])
        else:
            items[i] = map(float,items[i])

但是,我收到此错误:

错误消息:ValueError:float()的无效文字:

4

5 回答 5

8

一个有趣的版本(请不要使用此代码!):

from itertools import cycle
func = cycle((int, float))
new_items = [next(func)(i) for i in items]

编辑:作为一个更严肃的答案,您可能真的不想要这种混合列表。使用对列表可能更有用,每对的第一项是整数,第二项是浮点数。这个数据结构可以从你的列表中使用

new_items = [(int(x), float(y)) for x, y in zip(*[iter(items)] * 2)]
于 2012-06-15T13:42:58.977 回答
5
new_items = [float(item) if index % 2 else int(item)
             for index, item in enumerate(items)]
于 2012-06-15T13:42:52.540 回答
1

使用切片,您可以就地更新列表。(与创建新列表的其他一些解决方案相比——差异是微妙的,在某些情况下并不重要,但无论如何最好知道你在做什么)。

a[::2]=map(int,a[::2])
a[1::2]=map(float,a[1::2])

a[::2]从 0 开始a[1::2]获取所有其他元素,从 1 开始获取所有其他元素。

或者,如果您愿意,可以使用列表理解...

a[::2]=[int(x) for x in a[::2]]
a[1::2]=[float(x) for x in a[1::2]]
于 2012-06-15T13:52:17.630 回答
1

我推荐迈克尔霍夫曼的解决方案,但了解代码中的错误可能对我有用:

for i in range(36):
    if i%2==0:
        items[i] = map(int, items[i])
        # should be: items[i] = int(items[i])
    else:
        items[i] = map(float,items[i])
        # should be: items[i] = float(items[i])

map对列表的每个元素调用一个函数,但在这种情况下,您希望在单个元素上调用intand ,因为您已经在循环。floatitems[i]

(另外,for i in range(26)应该是for i in range(len(items))。请不要使用魔法常数。)

于 2012-06-15T13:44:32.270 回答
0

按照您的解决方案:

for i in range(36):
    if i%2==0:
        items[i] = int(items[i])
    else:
        items[i] = float(items[i])
于 2012-06-15T13:43:09.347 回答