这样做更有效的方法是什么?

2024-10-02 12:32:49 发布

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

这段代码的目标是用户输入一个字符串,其中包含三个任意顺序的“通配符”。我在我的程序中赋予了一个意义?是任意字母或数字,#是任意数字,&是任意字母)。然后我想要一个适当字母和/或数字的每个组合的列表,但是它必须保持与原始通配符相同的顺序。最后,我将把所有这些新的组合替换回原来的字符串。你知道吗

wildcards = ['?', '#', '&'] #user has entered wildcards in this order
n = len(wildcards)
list = itertools.product('abc123',repeat=n) #creates a cartesian product of every combination of letters and numbers (only using abc123 to be more manageable for now. 
print(list)
for x in list: #going to iterate through the list
    iter = 0
    while iter < n: #iterating through an individual object in the list
        if wildcards[iter] == '#': #if that index should be a number but isn't, we delete that object from the list
            if x[iter] != string.digits:
                del list[x]
        elif wildcards[iter] == '&': #if it should be a letter and isn't we delete the object
            if x[iter] != string.ascii_lowercase:
                del list[x]
        iter = iter+1
print(list) #print the new list

我觉得这应该行得通,但必须有一个更有效的方法。我也遇到了这个错误。类型错误:'itertools.产品'对象不支持项删除,因此无法删除不正确的列表项。这是因为它是一个元组,我不能修改元组元素吗?你知道吗


Tags: the字符串in列表ifobject顺序字母
1条回答
网友
1楼 · 发布于 2024-10-02 12:32:49

您可以使用^{}

import itertools
import string

user_string = '???'
iterables = []
for c in user_string:
    if c == '?':
        iterables.append(string.ascii_lowercase + string.digits)
    elif c == '&':
        iterables.append(string.ascii_lowercase)
    elif c == '#':
        iterables.append(string.digits)

for item in itertools.product(*iterables):
    print(''.join(item))

如果user_string包含通配符以外的字符,也可以执行此操作:

import itertools
import string

user_string = 'aaa???'
iterables = []
for c in user_string:
    if c == '?':
        iterables.append(string.ascii_lowercase + string.digits)
    elif c == '&':
        iterables.append(string.ascii_lowercase)
    elif c == '#':
        iterables.append(string.digits)
    else:
        iterables.append([c])

for item in itertools.product(*iterables):
    print(''.join(item))

相关问题 更多 >

    热门问题