【问题标题】:Python - set list range to a specific valuePython - 将列表范围设置为特定值
【发布时间】:2012-07-08 20:26:39
【问题描述】:

我需要根据具有边界(start,end) 的元组将列表的子集设置为特定值。

目前我正在这样做:

indexes = range(bounds[0], bounds[1] + 1)
for i in indexes:
   my_list[i] = 'foo'

这对我来说似乎不太好。有没有更 Pythonic 的方法?

【问题讨论】:

  • 您可以使用切片分配,但我认为您的方法很好。顺便说一下,index 的复数形式是 indices.
  • 老实说,他们这样做的方式很好且可读性强,我认为将其压缩为一行不会增加任何内容。
  • @wim,我也更喜欢 indices,但大多数现代词典都认为两者都可以接受。
  • @wim 我认为“索引”在美国/加拿大可能更常见,而“索引”在英国/奥兹更常见
  • 只是为了再次强调一点,我认为您在问题中的处理方式比使用切片分配的答案更Pythonic。 python 的禅宗说,“简单胜于复杂”。您只是将列表的几个元素设置为一个值,不需要在那里进行切片分配,所做的只是通过让您计算更多值来为错误引入更多范围(通过生成您正在分配的数组通过)。保留你所拥有的。

标签: python list python-2.7


【解决方案1】:

使用切片赋值:

my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0])

或使用局部变量只添加一次+ 1

lower, upper = bounds
upper += 1
my_list[lower:upper] = ['foo'] * (upper - lower)

您可能希望将上限存储为不包含在内,以便更好地使用 python 并避免所有 + 1 计数。

演示:

>>> my_list = range(10)
>>> bounds = (2, 5)
>>> my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0])
>>> my_list
[0, 1, 'foo', 'foo', 'foo', 'foo', 6, 7, 8, 9]

【讨论】:

  • +1 以“将上限存储为非包含”。 n + 1 个错误是一个巨大的痛苦。
【解决方案2】:
>>> L = list("qwerty")
>>> L
['q', 'w', 'e', 'r', 't', 'y']
>>> L[2:4] = ["foo"] * (4-2)
>>> L
['q', 'w', 'foo', 'foo', 't', 'y']

【讨论】:

    【解决方案3】:

    这是@MartijnPieters 使用itertools.repeat 的解决方案的更有效版本

    import itertools
    lower, upper = bounds
    upper += 1
    my_list[lower:upper] = itertools.repeat('foo', (upper - lower))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2021-09-14
      • 1970-01-01
      • 2018-03-31
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多