【问题标题】:Changing Elements in a list of Strings [duplicate]更改字符串列表中的元素[重复]
【发布时间】:2017-06-03 21:04:33
【问题描述】:

我想创建一个字符串列表。字符串应该是相同的,除了一些元素,它们应该是不同的。这样做我遇到了一个奇怪的行为:

x = ['spam', 'spam', 'spam', 'spam', 'spam']
x[1] = 'buzz'
x[2] = 'buzz'
x

Out[35]: ['spam', 'buzz', 'buzz', 'spam', 'spam']

但另一方面:

y = ['spam'] * 5
y[1:3] = ['buzz']
y
Out[36]: ['spam', 'buzz', 'spam', 'spam']

有人可以告诉我我做错了什么吗?非常感谢您的帮助!

【问题讨论】:

  • 就地y[1:3] = ['buzz'] 使y[1:3] = ['buzz'] * 2

标签: python


【解决方案1】:

任务:

y = ['spam'] * 5

将导致y 成为这样的列表:

['spam', 'spam', 'spam', 'spam', 'spam']

数组切片 y[1:3] 捕获索引 1 和 2 处的元素,如下所示:

['spam', 'spam']

将切片与索引 1 处的数组对齐(切片开始的位置):

['spam', 'spam', 'spam', 'spam', 'spam'] # y ['spam', 'spam'] # y[1:3]

现在,当您分配 y[1:3] = ['buzz'] 时,它实际上会将其变成以下内容:

['spam', 'buzz', 'spam', 'spam'] ['嗡嗡声']

【讨论】:

    【解决方案2】:

    y[1:3] 是列表的一个切片,您可以将此切片替换为由单个元素组成的列表。

    spam spam spam spam spam
         \       /
          \     /
           \   /
    spam    buzz   spam spam
    

    IIUC,你要做的就是用N倍新元素(buzz)组成的相同大小的列表替换它。

    你可以写

    y[1:3] = ['buzz', 'buzz']
    # or equivalently
    y[1:3] = ['buzz'] * 2
    

    这比使用这样的循环等效且更有效:

    for i in [1, 2]:
        y[i] = 'buzz'
    # or equivalently
    for i in range(1, 3):
        y[i] = 'buzz'
    

    作为旁注,这是另一个陷阱。一个字符串是一个迭代器,所以每当需要一个迭代器并且你传递一个字符串时,字符串会逐个字符地迭代,作为一个字符的字符串列表:

    y[1:3] = 'buzz'
    print(y)
    # ['spam', 'b', 'u', 'z', 'z', 'spam', 'spam', 'spam']
    

    在这种情况下,切片 [1:3] 被替换为您提供的迭代器,即“buzz”,被视为 ['b', 'u', 'z', 'z']。

    【讨论】:

    • 哇,你们真快!感谢所有的答案!
    【解决方案3】:
    y[1:3] = ['buzz']
    

    这和y[1] = 'buzz'加y[2] = 'buzz'不一样

    只做一个for循环

    for i in [1,2..whatever you need to change]:
        y[i] = 'buzz'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多