【问题标题】:Simplifying nested-lists as a Cartesian product将嵌套列表简化为笛卡尔积
【发布时间】:2016-06-03 12:41:22
【问题描述】:

我在 Python 中有一个嵌套列表:

lst = ['alpha', ['beta', 'gamma'], ['delta', 'peta', 'lambda']]

我需要一个函数来返回一个包含它们的笛卡尔积的列表。好吧,我认为笛卡尔积不是一个正确的词,但从逻辑上讲,结果仍然如下所示:

final_lst = your_magical_function(lst)
print final_lst

'''
[['alpha','beta','delta'],
['alpha','beta','peta'],
['alpha','beta','lambda'],
['alpha','gamma','delta'],
['alpha','gamma','peta']
['alpha','gamma','lambda']]
'''

欢迎使用带递归或不带递归的函数。

【问题讨论】:

  • 为什么一定要用递归?
  • 没关系,我真的不需要递归函数。

标签: python recursion nested-lists


【解决方案1】:

使用itertools.product,这将需要您稍微修改您的输入('alpha'['alpha']):

from itertools import product

lst = [['alpha'],['beta','gamma'],['delta','peta','lambda']]

for res in product(*lst):
    print(res)

>> ('alpha', 'beta', 'delta')

('alpha', 'beta', 'peta')
('alpha', 'beta', 'lambda')
('alpha', 'gamma', 'delta')
('alpha', 'gamma', 'peta')
('alpha', 'gamma', 'lambda') 

【讨论】:

    【解决方案2】:

    将所有项目转换为列表后,您可以使用itertools.product

    >>> from itertools import product
    >>> lst = ['alpha',['beta','gamma'],['delta','peta','lambda']]
    >>> list(product(*(x if isinstance(x, list) else [x] for x in lst)))
    [('alpha', 'beta', 'delta'), ('alpha', 'beta', 'peta'), ('alpha', 'beta', 'lambda'), ('alpha', 'gamma', 'delta'), ('alpha', 'gamma', 'peta'), ('alpha', 'gamma', 'lambda')]
    

    【讨论】:

      【解决方案3】:

      在 Python 中使用库真是太棒了!但是,如果您正在寻找纯 Python 实现:

      def CartesianProduct(list_entry):
      # Save Sizes of Everything
      size_dictionary = {}
      
      # Get Size of Entire Entry List
      size_dictionary["full_size"] = len(list_entry)
      
      # Get Sizes of All Sub Entries
      for i in range(len(list_entry)):
          if not (isinstance(list_entry[i],list)):
              list_entry[i] = [list_entry[i]]
          size_dictionary[i] = len(list_entry[i])
      
      # Now lets create the cartesian product
      # Lets Create a Dictionary to hold all of the results
      cartesian_result = {}
      
      # Lets get the size of the final result
      final_result_amount = 1
      for i in range(size_dictionary["full_size"]):
          final_result_amount = final_result_amount * size_dictionary[i]
      
      # And create the final results
      for i in range(final_result_amount):
          cartesian_result[i] = []
      
          for j in range(size_dictionary["full_size"]):
              cartesian_result[i].append(list_entry[j][i % size_dictionary[j]])
      
          print(cartesian_result[i])
      
      def main():
          lst = ['alpha',['beta','gamma'],['delta','peta','lambda']]
          CartesianProduct(lst)
      
      main()
      

      它并不像使用 itertools 那样漂亮和简单,但实现库偶尔使用的逻辑仍然很有趣。

      【讨论】:

        猜你喜欢
        • 2011-02-06
        • 2018-11-09
        • 2012-03-24
        • 2017-08-24
        • 2013-07-14
        • 2015-05-14
        • 1970-01-01
        • 2017-07-15
        • 2012-01-03
        相关资源
        最近更新 更多