组合列表中的元素:似乎python以两种不同的方式处理相同的项目,我不知道为什么

时间:2013-06-21 16:34:32

标签: python list python-2.7

我正在通过CodeAcademy工作,我有一个问题,那里没有答案。分配是获取列表列表并列出其所有元素的单个列表。下面的代码是我的答案。但我不明白为什么“item”被视为该代码列表中的元素,而(请参阅下面的评论)...

m = [1, 2, 3]
n = [4, 5, 6]
o = [7, 8, 9]

def join_lists(*args):
    new_list = []
    for item in args:        
        new_list += item
    return new_list


print join_lists(m, n, o)

...下面代码中的“item”被视为整个列表而不是列表中的元素。下面的代码给出了输出:

 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

我也尝试使用: new_list.append(item [0:] [0:])认为它将遍历索引和子索引,但它给出了相同的结果。我只是不明白这是如何被解释的。

m = [1, 2, 3]
n = [4, 5, 6]
o = [7, 8, 9]


def join_lists(*args):
    new_list = []
    for item in args:        
        new_list.append(item)
    return new_list


print join_lists(m, n, o)

另外,我知道我可以在上面的代码中添加另一个for循环,我知道为什么会起作用,但我仍然不明白为什么Python会以不同的方式解释这些差异。

2 个答案:

答案 0 :(得分:8)

列表中的+=就地添加运算符与在new_list上调用list.extend()的功能相同。 .extend()采用可迭代的方式,并将每个元素添加到列表中。

另一方面,

list.append()单个项添加到列表中。

>>> lst = []
>>> lst.extend([1, 2, 3])
>>> lst
[1, 2, 3]
>>> lst.append([1, 2, 3])
>>> lst
[1, 2, 3, [1, 2, 3]]

答案 1 :(得分:2)

Martijn(一如既往)已经很好地解释了这一点。但是,(仅供参考)Pythonic方法将是:

def join_lists(*args):
    from itertools import chain
    return list(chain.from_iterable(args))