附加具有数字的序列的所有可能性

时间:2012-12-28 05:21:20

标签: python append sequence

我有一个消耗我大脑的问题。让我们假设变量I存储序列,变量II存储另一个变量,变量III也存储另一个变量。变量1表示数字1,接下来的2表示下一个3;然后我有另一个关键变量,包含这3个序列的随机字符。给出这个事实,我可以轻松地在对应的数字中翻译这个关键变量的字符。在示例x = 'afh'中,与x = '123'相同,因为A OR B OR C = 1,依此类推。

现在出现了复杂的部分:

当键变量x被翻译成数字时,每个字符单独出现,我也可以从结果中随机返回字符。例如:x = '123',然后我可以返回['a','e','f']['b','d','i']等列表,尤其是在我使用random.choice()时。从这一点来看,我无法弄清楚如何做到:

如何从变量I,II,III中将所有可能的变化附加到列表中。例如:

['adg','beh','cfi','aei','ceg',...]

我知道如何打印无休止的随机组合,但在这种情况下,我得到重复,我不想要它们。我想在列表中附加I,II和III之间的所有可能的变化,因为当它们被翻译成数字时,我可以从相应的序列中返回任何字符。好吧,我希望我的例子可以自我解释。我非常感谢你的关注!

I = 'abc' # 1
II = 'def' # 2
III = 'ghi' # 3
x = 'afh' # Random possibility: It could be an input.
L = []
LL = []

for i in range(len(x)):
    if x[i] in I:
        L.append(1)
    if x[i] in II:
        L.append(2)
    if x[i] in III:
        L.append(3)

for i in range(len(L)): # Here lies the mistery...
    if L[i] == 1:
        LL.append(I) 
    if L[i] == 2:
        LL.append(II)
    if L[i] == 3:
        LL.append(III)

print L
print LL

输出结果为:

[1, 2, 3]

['abc', 'def', 'ghi']

3 个答案:

答案 0 :(得分:1)

以下是我重写代码的方法。像你这样的陈述是一个很大的代码味道。我将序列放入元组并使用单个循环。我还用列表理解替换了第二个循环。

顺便说一句,如果你像一个明智的人一样使用基于零的索引,你也可以简化索引。

I = 'abc' # 1
II = 'def' # 2
III = 'ghi' # 3
x = 'afh' # Random possibility: It could be an input.
L = []
LL = []

lists = I, II, III

for c in x:
    for i, seq in enumerate(lists):
        if c in seq:
            L.append(i+1)

LL = [lists[i-1] for i in L]

print L
print LL

另外,请务必查看itertools模块,尤其是product功能。目前尚不清楚您的意思,但产品会为您提供每个序列列表中项目的所有组合。

答案 1 :(得分:0)

非常感谢锑!答案正是来自itertools的product()。带有它的代码更加简单:

from itertools import *

I = 'abc' # 1
II = 'def' # 2
III = 'ghi' # 3

IV = product(I,II,III)

for i in IV:
    print i

输出正是我想要的,每种可能的组合:

('a', 'd', 'g')
('a', 'd', 'h')
('a', 'd', 'i')
('a', 'e', 'g')
('a', 'e', 'h')
('a', 'e', 'i')
('a', 'f', 'g')
('a', 'f', 'h')
('a', 'f', 'i')
('b', 'd', 'g')
('b', 'd', 'h')
('b', 'd', 'i')
('b', 'e', 'g')
('b', 'e', 'h')
('b', 'e', 'i')
('b', 'f', 'g')
('b', 'f', 'h')
('b', 'f', 'i')
('c', 'd', 'g')
('c', 'd', 'h')
('c', 'd', 'i')
('c', 'e', 'g')
('c', 'e', 'h')
('c', 'e', 'i')
('c', 'f', 'g')
('c', 'f', 'h')
('c', 'f', 'i')

答案 2 :(得分:0)

    python 3.2


    [(i,v,c) for i in I for v in II for c in III]