试图迭代列表Python

时间:2017-12-11 16:09:00

标签: 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'

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的逻辑需要稍微调整:如果您想要重复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