如何在python列表列表中的每个项目之间循环?

时间:2019-06-06 10:15:38

标签: python list for-loop

我有一个存储在列表中的项目列表,作为列表的列表。我想从每个项目中删除一个特定字符(如果找到)。如果我只使用列表的第一个元素,我就能做到。但是,在使用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]]

4 个答案:

答案 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]:
    ...

尚不清楚在评估ilist[i][i]的值是什么,但是无论如何它都不起作用,因为您想做的是遍历主列表以及每个列表中的内容。它的元素,这也是列表。 尽管您可以通过显式索引来解决这个问题,但是Python为您提供了一种更好的方法,即直接遍历元素。

最重要的是,通常来说,您的正则表达式方法将不起作用,原因是:

re.sub('x', ', ', list1[0][0])

实际上正在生成一个字符串,该字符串在打印时看起来与Python打印数字列表的方式相同,但不是数字列表

您要做的是将字符串转换为数字类型。 如果您只需要float的列表,那么只需投射float的有效文本表示就可以解决问题,例如float('1.5') == 1.5int也是如此,例如int('432') == 432(但int('1.5')将引发ValueError)。 如果您希望intfloat拥有不同的对象(如预期的输出所示),则可以先尝试转换为int,如果失败,则转换为{{ 1}}:

float

考虑到这一点,您现在需要确保该函数的输入将是带有数字的字符串。 显然,def to_number(value): try: value = int(value) except ValueError: value = float(value) finally: return value 甚至1x2都不是,即1, 2int('1x2')(或者用int('1, 2')而不是float)都将上升{ {1}}。 但是,Python提供了一种简单的解析(很好地拆分)该字符串的方式,您可以在列表中获得intValueError

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

这是使用astitertools.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]]