迭代Python中的列表列表

时间:2014-03-16 21:37:46

标签: python nested-lists

我有一份清单清单:

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

我想迭代每个元素并对它们执行一些字符串操作,例如:

replace("(", "")

我尝试使用以下方法迭代列表:

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

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

谢谢,

3 个答案:

答案 0 :(得分:8)

修改

是的,如果你想要,你应该使用普通的for循环:

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

  2. 将主列表和子列表保持为相同的对象。

  3. 以下是如何执行此操作的简单演示:

    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
    

    使用nested list comprehension

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

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

答案 1 :(得分: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'等于先前转换的元组的元组。 <如果这没有意义,我所说的是初始元组被转换为列表(然后进行操作),然后转换回元组(因为你希望它以相同的格式结束)和以前一样)。

希望这有帮助!

答案 2 :(得分: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)']]