在Python中迭代嵌套列表

3

我有一个列表的列表:

lst1 = [["(a)", "(b)", "(c)"],["(d)", "(e)", "(f)", "(g)"]]

我想要遍历每个元素并对它们执行一些字符串操作,例如:
replace("(", "")

我尝试使用以下方式遍历列表:

for l1 in lst1:
   for i in l1:
       lst2.append(list(map(str.replace("(", ""), l1)))

我希望输出的结果与原始列表相同,但不包含括号。此外,我正在寻找一种编辑列表的方法,而不是针对这个问题的具体解决方案。

谢谢您。

3个回答

8

编辑:

如果你想要:

  1. 对每个子列表中的每个项目执行多个操作。

  2. 保持主列表和子列表作为同一对象。

那么你应该使用普通的for循环,以下是如何实现的简单演示:

main = [["(a)", "(b)", "(c)"], ["(d)", "(e)", "(f)", "(g)"]]

print id(main)
print id(main[0])
print id(main[1])
print

for sub in main:
    for index,item in enumerate(sub):

        ### Preform operations ###
        item = item.replace("(", "")
        item = item.replace(")", "")
        item *= 2

        sub[index] = item  # Reassign the item

print main
print
print id(main)
print id(main[0])
print id(main[1])

输出:

25321880
25321600
25276288

[['aa', 'bb', 'cc'], ['dd', 'ee', 'ff', 'gg']]

25321880
25321600
25276288

使用 嵌套列表推导式

>>> lst1 = [["(a)", "(b)", "(c)"],["(d)", "(e)", "(f)", "(g)"]]
>>> id(lst1)
35863808
>>> lst1[:] = [[y.replace("(", "") for y in x] for x in lst1]
>>> lst1
[['a)', 'b)', 'c)'], ['d)', 'e)', 'f)', 'g)']]
>>> id(lst1)
35863808
>>>

[:]将保持列表对象不变。


这可能就是我想使用for循环的原因,因为我可以连续执行多个操作。对吧? - konrad
“strip it of…commas”是什么意思?元素之间还需要逗号。 - Ol' Reliable
@user3263488 - 如果您想执行多个操作,应该使用for循环。您希望子列表保持不变还是只保持主列表不变? - user2555451
是的,我想保持数据输出格式与输入原始格式相同。 - konrad
@user3263488 如果你想在子列表中执行多个操作,只需将它们包装在函数中,这样它们就成为一个操作了 ;) - m.wasowski
显示剩余6条评论

0

我刚刚做了你所做的,我利用了列表中每个元素都可以被赋予新值(或更新)的事实:

>>> lst1 = [["(a)", "(b)", "(c)"],["(d)", "(e)", "(f)", "(g)"]]
>>> for x in range(len(lst1)):
        for y in range(len(lst1[x])):
            lst1[x][y] = lst1[x][y].replace("(", "")
>>> lst1
[['a)', 'b)', 'c)'], ['d)', 'e)', 'f)', 'g)']]

编辑

这是你在评论中提到的“真正问题”的解决方法:

a = [[(12.22, 12.122, 0.000)], [(1232.11, 123.1231, 0.000)]]
some_num = 10
for x in range(len(a)):
    b = list(a[x][0])
    for y in range(len(b)):
        b[y] *= some_num
    a[x] = tuple(b)
print(a)

输出:

[(122.2, 121.22, 0.0), (12321.099999999999, 1231.231, 0.0)]

所有元素都乘以一个数字,并保留原始格式

它是这样工作的:

所以你有最初的列表'a',其中有两个子列表,每个子列表只有一个元素(包含x、y、z坐标的元组)。我遍历列表'a',将元组转换为列表并将它们设置为'b'(因此第四行在第一次循环时具有值[12.22、12.122、0.000](下一个元组(作为列表)在下一次循环中)。

然后,我遍历'b'中的每个元素(将元组转换为列表),并使用增量运算符(+=、-=、/=、*=)将该元组中的每个元素乘以一个数字。一旦完成此循环,我将主列表'a'中的相同位置设置为先前转换的元组的元组。 <如果这不合理,我的意思是将初始元组转换为列表(然后进行操作),然后再将其转换回元组(因为您希望它最终具有与之前相同的格式)。

希望这可以帮助!


是的,你说得对,解决这个问题有很多方法,我只是按照他的思路回答了。个人而言,我会像@user3263488那样做。 - Ol' Reliable
在我之前的评论中,我指的是用户@iCodez。 - Ol' Reliable
1
range(0, len(lst1)) 是多余的,range(len(lst1)) 就足够了。 - m.wasowski
是的,这看起来非常不错。我想知道为什么这种方法不能在像这样的列表上工作:a = [[[(12, 12, 12)],[(13, 13, 13)],[(15, 15, 15)]], [[(12, 12, 12)],[(13, 13, 13)],[(15, 15, 15)]]] 它只对第一个列表及其子列表执行操作,而不是对第二个及其后面的任何列表执行操作。 - konrad
因为你有一个列表内嵌了另一个列表,而且这个列表又内嵌了另一个列表。我的代码可以解决像你的例子一样的结构:[[(12.22,12.122,0.000)],[(1232.11,123.1231,0.000)]],这只是一个内嵌了另一个列表的列表。 - Ol' Reliable
显示剩余4条评论

0
>>> lst1 = [["(a)", "(b)", "(c)"],["(d)", "(e)", "(f)", "(g)"]]
>>> [[j.strip('()') for j in i] for i in lst1]
[['a', 'b', 'c'], ['d', 'e', 'f', 'g']]
>>> [[j.lstrip('(') for j in i] for i in lst1]
[['a)', 'b)', 'c)'], ['d)', 'e)', 'f)', 'g)']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接