[英]Replacing every other position in a list
我正在尝试制作一些东西,使我可以用单个项目替换列表中的所有其他 position:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = "A"
print(l)
我期待类似的东西:
["A", 1, "A," 3, "A", "A", 6, "A", 8, "A", 10]
我尝试了索引[::]
的不同位置,但要么得到错误,要么得到不包括列表中 rest 的结果。
相反,我得到了这个:
ValueError: attempt to assign sequence of size 1 to extended slice of size 2
切片是正确的,但您需要提供一个包含足够元素的序列来填充所有元素。
l[::2] = ["A"] * math.ceil(len(l)/)
编辑:Barmar 的答案要好得多,只要您可以导入数学库。
10,000 个循环的粗略速度比较(假设您没有将列表变成生成器,否则列表理解总体上会稍微快一些):
import math, time
def slicing(n):
for _ in range(n):
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = ["A"] * math.ceil(len(l)/2)
def comprehension(n):
for _ in range(n):
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
start = time.time()
slicing(10000)
print(f'Using slicing and math.ceil: {time.time() - start} seconds')
start = time.time()
comprehension(10000)
print(f'Using list comprehension: {time.time() - start} seconds')
>>> Using slicing and math.ceil: 0.004003286361694336 seconds
>>> Using list comprehension: 0.012019157409667969 seconds
老答案:
尝试使用与enumerate配对的列表理解:
l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
这将用字母“A”的奇数索引(奇数 % 2 将等于 0)替换每个元素,并将其余元素保持原样。 Enumerate 循环遍历原始的可迭代对象,但也包含一个索引元素。
您必须提供与要分配的项目一样多的元素:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = ("A" for _ in l[::2])
print(l)
['A', 1, 'A', 3, 'A', 5, 'A', 7, 'A', 9, 'A']
或者这样:
l[::2] = ["A"]*len(range(0,len(l),2))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.