【问题标题】:Loop within lists and assign the item to a new list - wired behavior在列表中循环并将项目分配给新列表 - 有线行为
【发布时间】:2019-02-17 12:10:09
【问题描述】:

我遍历列表列表,当我将项目附加到数组时,它单独添加每个字母而不是整个单词,除非我删除“[]”。为什么会发生,只是好奇? 示例:

只是想知道为什么会发生这种行为

def printTable(lists):
    for list in lists:
        s = []
        for item in list:
            s += item
            print(s)
        print()     


tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

printTable(tableData)

它不是将每个项目添加到列表中,而是添加每个字母(同时删除列表数据类型,它按字母添加它们作为例外)只是好奇为什么会发生这种情况。

【问题讨论】:

  • 你不应该使用list作为变量名,因为这是一个内置的

标签: python list for-loop


【解决方案1】:

代替s += item试试这个:

s.append(item)

当您说s += item 时,它等同于s = s + item,当然s 是列表,item 是字符串,并且在python 中字符串是可迭代的,所以这就是它看起来像这样的原因。

看下面的例子:

a = 'hi'
print(list(a))
['h', 'i']

正如@roganjosh 在 cmets 中所说:

注意使用list作为变量名不好,list是python内置的。

【讨论】:

    【解决方案2】:

    欢迎来到 Stackoverflow。这是一个很有趣的问题。

    您的外部循环将 list (顺便说一下,因为这也是 Python 内置类型的名称)设置为每个子列表,内部循环将 item 设置为值内部列表中的每个单词。

    你写了吗

    s = s + item
    

    而不是

    s += item
    

    那么您会看到由于右侧的表达式引发的异常:

    >>> [] + "abc"
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    
    TypeError: can only concatenate list (not "str") to list
    

    但是,+= 运算符的行为并不完全相同。 this question 中有一个有趣的讨论。底线是,如果+= 的右手运算符是可迭代的,那么解释器将对其进行迭代,将每个项目附加到列表中。

    如果您只是想将每个项目添加到 s 列表中,您应该改用 append 方法:

    s.append(item)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多