尝试在Python列表中迭代

2024-04-24 01:14:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我还在尝试创建一个半随机的字母列表。我想我的名单有60个字母,但正好有20%的时间,我想同一封信比2封信回来。。你知道吗

我做了以下代码:

import random
from random import shuffle
import pandas as pd

probab = range(61)

shuffle(probab)

letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']

my_list = [random.choice(letters) for _ in range(2)]

for i in probab.items():
    if i < 12:   # choice of number between
        my_list.append(my_list[len(my_list)-2])   # add the letter n-2

    else:
        my_list.append(random.choice(letters))

print(my_list).     

我们解决这个问题的逻辑是,我从1-60创建一个列表,然后混合它。你知道吗

在我想做一个循环,代码看如果第一个项目小于12,如果是,然后添加相同的字母比2回来,如果不添加一个随机字母。。。你知道吗

我以为是12,因为是60的20%

当我运行列出的代码时,出现以下错误:

for i in probab.items():
AttributeError: 'list' object has no attribute 'items'

谢谢你的帮助。你知道吗


Tags: 代码inimport列表formy字母items
1条回答
网友
1楼 · 发布于 2024-04-24 01:14:51

你的逻辑需要稍微调整一下:如果你想重复20%的时间,那么其他80%的时间你必须确保你不要重复。简单的方法是使用循环。或者,您可以从不包含不需要的字母的字母集合中进行选择,但是这样会更加冗长,并且在生成随机字母时执行一两个额外的循环可能会更快。你知道吗

另外,因为您想要一个60个字母的列表,probab的长度必须是58。而且不需要制作letters列表:random.choice会很高兴地从字符串中选择。你知道吗

from random import choice, shuffle 

num = 60

letters = 'ABCDEFGHIJKL'
my_list = [choice(letters),  choice(letters)]
probab = list(range(num - 2))
shuffle(probab)

# We want 20% of the letters to repeat the letter 2 letters back
repeatnum = num * 20 // 100 
for i in probab:
    ch = prev = my_list[-2]
    if i >= repeatnum:
        while ch == prev:
            ch = choice(letters)
    my_list.append(ch)

# verify 
count = 0
for i in range(2, num):
    if my_list[i] == my_list[i - 2]:
        count += 1

print(''.join(my_list), len(my_list), count)

典型输出

GBJEBKKKLKGJGKHIBLDKGKCKIKFCABDDBCKFJDEDJLAAADALEIIFICHHEGEG 60 12

相关问题 更多 >