当前位置: 首页 > 知识库问答 >
问题:

用数字追加序列中的所有可能性

许彦
2023-03-14

我有一个问题困扰着我的大脑。让我们假设变量I存储一个序列,变量II存储另一个序列,变量III存储另一个序列。变量1将表示数字1、下一个2和下一个3;然后我有另一个关键变量,具有这3个序列的随机字符。考虑到这一事实,我可以很容易地将这个关键变量的字符翻译成相应的数字。在示例中,x='afh',than,也就是说,x='123',因为A或B或C=1,依此类推。

现在是复杂的部分:

当关键变量x被转换为数字时,每个字符都是单独的,我还可以从结果中随机返回字符。例如:x='123',然后我可以返回一个列表,如['a','e','f'],或['b','d','I'],尤其是如果我使用了随机。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个答案

权承
2023-03-14
    python 3.2


    [(i,v,c) for i in I for v in II for c in III]
巴宏恺
2023-03-14

非常感谢锑!答案正是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')
娄利
2023-03-14

下面是我将如何重写您的代码。像您这样冗长的if语句是一种巨大的代码气味。我将序列放入一个元组,并使用一个循环。我还用列表理解替换了第二个循环。

顺便说一下,如果您像一个明智的人那样使用基于零的索引,您还可以简化索引。

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为您提供了序列列表中每个项目的所有组合。

 类似资料:
  • 问题内容: 我有从0到8的数字。我想结果是这些数字的所有可能集合,每个集合都应使用所有数字,每个数字在集合中只能出现一次。 我希望看到用PHP制作的解决方案可以打印出结果。或者,至少,我希望在组合理论上有所收获,因为我早已忘记了它。计算多少排列的公式是什么? 示例集: 0-1-2-3-4-5-6-7-8 0-1-2-3-4-5-6-8-7 0-1-2-3-4-5-8-6-7 0-1-2-3-4-8

  • 问题内容: 我有一些复杂的计算算法,基本上可以测试一些较小的矩阵是否适合另一个较大的矩阵。 是否所有矩阵都适合大矩阵,取决于小矩阵的顺序。如果小矩阵不合适,则应重新排列ArrayList并重试,直到测试了所有可能的顺序/序列为止。 如果我有5个小矩阵,则总共有 5个! (= 120)数组可以有的订单。 我的问题是我不知道如何重新排列这些对象(矩阵),因此我可以测试所有可能的顺序。我希望有人可以帮助

  • 如果我有数字,从,其中数字在两者之间缺失,那么我如何计算所有可能的数字,可以从这些数字的加法中形成(2/3/4/5/6...)。 例如,假设我有数字,即缺少和。现在,我可以形成 这是我需要找出的,这是我无法使用给定数字组合形成的1中的第一个数字。一个简单的逻辑就可以了。谢谢!

  • 在我的用例中,我需要一个find a way将键/值对追加到现有序列文件中。怎么做?任何线索都会大有帮助。我正在使用Hadoop2X。

  • 我试图得到与输入arrayList相同长度的ArrayList的所有可能的排列。也就是说,1,2,3的ArrayList将导致123, 132, 213, 231, 321, 312,不包括1, 2, 12, 13等较短的排列。 坐标是一个类,它只有x、y和y,用于保存项目的二维点。 目前,我正在使用这段代码将其打印到控制台,但如果有人能告诉我如何将其存储到ArrayList中,我也将不胜感激

  • 问题内容: 在Python中,我有一个n个列表的列表,每个列表具有可变数量的元素。如何创建包含所有可能排列的单个列表: 例如 我想要 注意,我事先不知道n。我以为itertools.product是正确的方法,但它需要我提前知道参数的数量 问题答案: 您不需要事先知道使用