从一组模式生成项目列表时避免重复

时间:2017-07-13 11:40:58

标签: python algorithm

我试图创建一个具有特定模式的项目列表,到目前为止我的设计是这样的,

patterns = [
   '{column1}{column2}',
   '{column1}@{column3}',
   '{column2}#{column4}',
   '{column3}!@#'
]

for c1 in possible_column1:
   for c2 in possible_column2:
     for c3 in possible_column3:
        for c4 in possible_column4:
          data = { 
             'column1': c1,
             'column2': c2,
             'column3': c3,
             'column4': c4,
          }
          for pattern in patterns:
              result.append(pattern.format(**data))

设计有很多问题,

  1. 它会创建重复的值,我必须执行list(set(result))以使列表唯一
  2. 它很慢
  3. 编写此类算法的常用方法是什么?

    patterns列表会有所不同,并且会经常更改,也可能会添加新类型的列

    P.S
    在我看来,这与排列不同。

1 个答案:

答案 0 :(得分:2)

您可以使用其他数据结构(dict)来保留模式:

patterns = {
   '{0}{1}':  (possible_column1, possible_column2),
   '{0}@{1}': (possible_column1, possible_column3),
   '{0}#{1}': (possible_column2, possible_column4),
   '{0}!@#':  (possible_column3, )
}

使用该词典,您可以对该词典的“值”使用itertools.product

from itertools import product

# Just some data for the possible columns...
possible_column1 = list('12')
possible_column2 = list('34')
possible_column3 = list('56')
possible_column4 = list('78')

result = []
for pattern, cols in patterns.items():
    for prod in product(*cols):
        result.append(pattern.format(*prod))

# or if you like it shorter:
# result = [pattern.format(*prod) for pattern, cols in patterns.items() for prod in product(*cols)]

这样就不会创建重复的条目。