如何迭代列表的元组?

时间:2019-05-16 12:41:55

标签: python

好吧,这可能是一个愚蠢的想法,但是我现在还停留在那儿。 我正在处理元组类型的参数,其中包含列表列表,只是无法正确读取它们。

这是一个基本示例:

def test(*args):
    for arg in args:
        print(arg)
        print(arg[0])
        print(arg[1])

testTuple1 = ([["x_1", "x_2", "x_3"], []])
testTuple2 = ([['x_1', 'x_2', 'x_3'], []], [['x_2', 'x_3'], ['x_1']])

test(testTuple1)
test(testTuple2)

这将产生以下输出:

[['x_1', 'x_2', 'x_3'], []]
['x_1', 'x_2', 'x_3']
[]

([['x_1', 'x_2', 'x_3'], []], [['x_2', 'x_3'], ['x_1']])
[['x_1', 'x_2', 'x_3'], []]
[['x_2', 'x_3'], ['x_1']]

第一个示例的输出是我期望的输出。但是我没有得到第二个示例的第一个输出。为什么我得到一个元组而不是元组中包含的第一个列表:[['x_1','x_2','x_3'],[]]?

2 个答案:

答案 0 :(得分:2)

因为在python中,parens用于创建文字元组和常规表达式分组,因此产生了一些歧义。这是您的列表,为清晰起见添加了一些格式:

testTuple1 = (
               [
                 ["x_1", "x_2", "x_3"], 
                 []
               ]
             )

testTuple2 = (
               [
                 ['x_1', 'x_2', 'x_3'], 
                 []
               ], 
               [
                 ['x_2', 'x_3'], 
                 ['x_1']
               ]
             )

testTuple1由于外部括号仅包含一个项目(最外部的列表),因此将求值为该外部列表。 parens消失了。但是在testTuple2中,由于存在多个逗号分隔的列表,因此它将评估为元组。

如果您还希望第一个也是元组,则需要在外部列表后添加尾随逗号,以明确地让python知道这些括号是用来表示1元组的,而不仅仅是分组:

testTuple1 = ([["x_1", "x_2", "x_3"], []],)

答案 1 :(得分:0)

当您使用星号作为参数的修饰符时,它将使您在调用函数时可以传递任意多个参数。

def test(*args):
    # Do anything

test(v1)
test(v1, arg, another, something)
test()

它将最终将调用中的所有参数连接到一个元组中。

当您仅将一个参数传递给函数调用时,无论该对象实际上具有什么类,元组参数都将仅由该一个参数组成。只需在迭代之前进行打印即可。然后,您将看到args的实际值,它解析为:

([['x_1', 'x_2', 'x_3'], []],)


如果您想将迭代器传递给函数并将第一层的元素扩展到参数,只需在调用时再次使用星号即可。

>> test(*testTuple1)
['x_1', 'x_2', 'x_3']
'x_1'
'x_2'
[]

IndexError: ....

发生IndexError的原因是,空列表没有第0个或第一个要获取的元素。