我有一个如下所示的数组:['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()的文字无效:
答案 0 :(得分: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)]
答案 1 :(得分:5)
new_items = [float(item) if index % 2 else int(item)
for index, item in enumerate(items)]
答案 2 :(得分:1)
我推荐Michael Hoffman的解决方案,但知道代码中的错误可能会有用:
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
在列表的每个元素上调用一个函数,但在这种情况下,您要在单个元素int
上调用float
和items[i]
,因为您已经循环了。
(另外,for i in range(26)
应为for i in range(len(items))
。请不要使用魔术常量。)
答案 3 :(得分: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]]
答案 4 :(得分:0)
按照您的解决方案:
for i in range(36):
if i%2==0:
items[i] = int(items[i])
else:
items[i] = float(items[i])