【问题标题】:Find all combinations of letters, selecting each letter from a different key in a dictionary查找所有字母组合,从字典中的不同键中选择每个字母
【发布时间】:2013-01-19 11:09:16
【问题描述】:

假设我们有这个数据结构:

class Lock:
def __init__(self):
    self.data1 = ['a', 'd', 'e', 'l', 's']
    self.data2 = ['s', 'i', 'r', 't', 'n']
    self.data3 = ['b', 'o', 'e', 'm', 'k']
    self.data4 = ['f', 'y', 'u', 'n', 'g']

或者,

d = {'1': ['a', 'd', 'e', 'l', 's'], '2': ['s', 'i', 'r', 't', 'n'], '3': ['b', 'o', 'e', 'm', 'k'], '4': ['f', 'y', 'u', 'n', 'g'] }

我想找到所有可能的字母组合,因为每个字母都是从不同的键或数组中选择的。顺序很重要,所以第一个字母必须来自“data1”,第二个必须来自“data2”,等等。

目的是然后根据字典检查这些以查看哪些是英语有效单词。我假设获得所有组合的列表,然后进行检查将是最快的,但如果不是这样,我想要一些输入。

【问题讨论】:

    标签: python algorithm dictionary iteration permutation


    【解决方案1】:

    使用itertools.product():

    for combo in itertools.product(self.data1, self.data2, self.data3, self.data4):
        # combo is a tuple of 4 characters.
    

    或:

    for combo in itertools.product(*[d[k] for k in sorted(d.keys())]):
        # combo is a tuple of 4 characters.
    

    演示:

    >>> import itertools                                                                                                                >>> d = {'1': ['a', 'd', 'e', 'l', 's'], '2': ['s', 'i', 'r', 't', 'n'], '3': ['b', 'o', 'e', 'm', 'k'], '4': ['f', 'y', 'u', 'n', 'g'] }
    >>> for combo in itertools.product(*[d[k] for k in sorted(d.keys())]):
    ...     print ''.join(combo)
    ... 
    asbf
    asby
    asbu
    asbn
    asbg
    asof
    asoy
    asou
    ason
    asog
    asef
    
    ...
    
    snkf
    snky
    snku
    snkn
    snkg
    

    【讨论】:

      【解决方案2】:

      Martin 的回答很好,itertools.product 是最好的方法。由于它是在 2.6 版本中引入的,因此您可以回到 Python 2.5 及更早版本的老式风格:

      >>> [i1 + i2 + i3 + i4 for i1 in data1 for i2 in data2 for i3 in data3 for i4 in data4 ]
      ['asbf', 'asby', 'asbu', 'asbn', 'asbg', 'asof', 'asoy', 'asou', 'ason', 'asog', 'asef',
       'asey', 'aseu', 'asen', 'aseg', 'asmf', 'asmy', 'asmu', 'asmn', 'asmg', 'askf', 'asky', 
       'asku', 'askn', 'askg', 'aibf', 'aiby', 'aibu', 'aibn', 'aibg', 'aiof', 'aioy', 'aiou', 
       'aion', 'aiog', 'aief', 'aiey', 'aieu', 'aien', 'aieg', 'aimf', 'aimy', 'aimu', 'aimn', 
       'aimg', 'aikf', 'aiky', 'aiku', 'aikn', 'aikg', 'arbf', 'arby', 'arbu', 'arbn', 'arbg', 
       'arof', 'aroy', 'arou', 'aron', 'arog', 'aref', 'arey', 'areu', 'aren', 'areg', 'armf', 
       'army', 'armu', 'armn', 'armg', 'arkf', 'arky', 'arku', 'arkn', 'arkg', 'atbf', 'atby', 
       'atbu', 'atbn', 'atbg', 'atof', 'atoy', 'atou', 'aton', 'atog', 'atef', 'atey', 'ateu'
       ...
      

      【讨论】:

        【解决方案3】:

        不使用 itertools:

         def combination(x):
             list1 = g.values()[0]
             list2 = g.values()[1]
             for i in list1:
                 for j in list2:
                      print(i+j)
         combination({'1':['a','b'], '2':['c','d']})
        

        【讨论】:

          【解决方案4】:
          x={'1':['a','b'], '2':['c','d']}
          list1 = x.get('1')
          list2 = x.get('2')
            for i in range(2):
              for j in range(2):          
                print(list1[i]+list2[j])
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-08
          • 2013-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-04
          • 1970-01-01
          相关资源
          最近更新 更多