gpt4 book ai didi

python - 将元素扩展到 .pop 中使用的列表

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:22 24 4
gpt4 key购买 nike

我正在尝试创建一个伪随机序列生成器。有几个约束条件,第一个是每个序列应该有 24 个实例,并且结果中不应该连续出现一个序列。这是我的代码:

import random
def rgen():
block_list =[]
while len(block_list) != 96:
sequences = ['seq1','seq2','seq3','seq4']
block_list.extend(random.sample(sequences, 4))
for x,y in enumerate(block_list):
count = 'repeat'
while count == 'repeat':
if block_list[x] == block_list[x-1]:
block_list.pop(x)
block_list.extend(y)
count = 'repeat'
else:
count = 'no repeat'
sequence_counts = {'seq1':0,'seq2':0,'seq3':0,'seq4':0}
for i in block_list:
for k,v in sequence_counts.items():
if k == i:
v += 1
sequence_counts[k] = v
print 'counts for each sequence: ', sequence_counts
print block_list

然而,最终的结果是,我在列表的末尾得到了这样的东西:

's', 'e', 'q', '1', 's', 'e', 'q', '1', 's', 'e', 'q', '2', 's', 'e', 'q', '4'

当我真的只想扩展整个列表元素而不是单独的字符时。

所以我想扩展上面的整个字符串,它们实际上是:

'seq1','seq1','seq2','seq4'

最佳答案

您的问题来自使用 extend() 而不是 append()extend()假设您要将一个列表添加到另一个列表并将 y 的每个元素添加到 block_listcount 的使用是不必要的,因为您立即将 while 循环留在 else 语句中,因此您可以用 break() 替换它。每个元素的数量也存在问题。您拥有它的方式是删除一个元素,该元素会更改索引 x 处的值。要解决此问题,您知道弹出的值与索引 x 处的值匹配,因此只需将其设置为一个变量并将其添加回您的列表即可。如果在 pop()

之前和之后打印 block_list[x] ,您可以看到这种情况发生
while 1:
if block_list[x] == block_list[x-1]:
y = block_list.pop(x)
block_list.append(y)
#Alternatively, but not recommended, is to do .extend([y])
#That treats y as an element of a list rather than a list itself
else:
break

还有您现在拥有它的方式,您将列表视为循环列表。在第一个 for 循环的第一次迭代中,您比较索引 0 和索引 -1。要解决这个问题,您需要像这样使用 range()

for x in xrange(1,len(block_list)):
while 1:
if block_list[x] == block_list[x-1]:
y = block_list.pop(x)
block_list.append(y)
else:
break

['seq2', 'seq1', 'seq3', 'seq4', 'seq1', 'seq2', 'seq4', 'seq3',
...,
'seq3', 'seq1', 'seq2', 'seq4', 'seq3', 'seq2', 'seq3', 'seq4']

关于python - 将元素扩展到 .pop 中使用的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com