我有一个存储在列表中的项目列表,作为列表的列表。我想从每个项目中删除一个特定字符(如果找到)。如果我只使用列表的第一个元素,我就能做到。但是,在使用for循环时,出现“ IndexError:列表索引超出范围”。
这是我的清单。
list1 = [['2.6x3.65'],[],['2','2.9x1.7','2.5x1.3']]
这是我对第一个元素的处理方式。
if('x' in list1[0][0]):
rep1 = re.sub('x', ', ', list1[0][0])
这为我提供了2.6、3.65的字符串格式输出,以后可以转换为float。
但是,当我使用以下代码实现相同的for循环时:
for i in list1[i][i]:
if('x' in list1[i][i]):
rep2 = re.sub('x', ', ', list1[i][i])
在使用for循环时会给出“ IndexError:列表索引超出范围”。
我的预期结果如下:
list2 = [[2.6, 3.65],[],[2, 2.9, 1.7, 2.5, 1.3]]
答案 0 :(得分:3)
您可以使用嵌套列表理解:
list1 = [['2.6x3.65'], [], ['2', '2.9x1.7', '2.5x1.3']]
list2 = [sum([list(map(float, i.split('x'))) for i in l], []) for l in list1]
输出:
[[2.6, 3.65], [], [2.0, 2.9, 1.7, 2.5, 1.3]]
不将map()
与列表理解混合使用:
list2 = [[float(e) for i in l for e in i.split('x')] for l in list1]
答案 1 :(得分:2)
由于以下这一行,您的代码可能会出现错误:
for i in list1[i][i]:
...
尚不清楚在评估i
时list[i][i]
的值是什么,但是无论如何它都不起作用,因为您想做的是遍历主列表以及每个列表中的内容。它的元素,这也是列表。
尽管您可以通过显式索引来解决这个问题,但是Python为您提供了一种更好的方法,即直接遍历元素。
最重要的是,通常来说,您的正则表达式方法将不起作用,原因是:
re.sub('x', ', ', list1[0][0])
实际上正在生成一个字符串,该字符串在打印时看起来与Python打印数字列表的方式相同,但不是数字列表!
您要做的是将字符串转换为数字类型。
如果您只需要float
的列表,那么只需投射float
的有效文本表示就可以解决问题,例如float('1.5') == 1.5
。 int
也是如此,例如int('432') == 432
(但int('1.5')
将引发ValueError
)。
如果您希望int
和float
拥有不同的对象(如预期的输出所示),则可以先尝试转换为int
,如果失败,则转换为{{ 1}}:
float
考虑到这一点,您现在需要确保该函数的输入将是带有数字的字符串。
显然,def to_number(value):
try:
value = int(value)
except ValueError:
value = float(value)
finally:
return value
甚至1x2
都不是,即1, 2
和int('1x2')
(或者用int('1, 2')
而不是float
)都将上升{ {1}}。
但是,Python提供了一种简单的解析(很好地拆分)该字符串的方式,您可以在列表中获得int
和ValueError
:
'1'
即使您将此输出应用于不包含'2'
的文本,例如,
'1x2'.split('x') == ['1', '2']
有了所有这些构建块,现在就可以制定一个明智的解决方案(大量使用列表推导):
char
(编辑:添加了一些说明,并将代码完整地编写为列表理解)。
答案 2 :(得分:1)
一种方法是遍历您的列表并追加到新列表:
list1 = [['2.6x3.65'],[],['2','2.9x1.7','2.5x1.3']]
new_l = []
for l in list1:
temp = []
for elem in l:
new_s = elem.split("x")
temp.extend([float(x) for x in new_s])
new_l.append(temp)
print(new_l)
# [[2.6, 3.65], [], [2.0, 2.9, 1.7, 2.5, 1.3]]
答案 3 :(得分:1)
这是使用ast
和itertools.chain
的一种方法。
例如:
from itertools import chain
import ast
list1 = [['2.6x3.65'],[],['2','2.9x1.7','2.5x1.3']]
result = []
for i in list1:
temp = []
for j in i:
temp.append(map(ast.literal_eval, j.split("x")))
result.append(list(chain.from_iterable(temp)))
print(result)
输出:
[[2.6, 3.65], [], [2, 2.9, 1.7, 2.5, 1.3]]