1

私は4つの価値観を持っています

age = 23
gender = "M"
city ="Delhi"
religion = "Muslim"

-のような空の値を持つすべての組み合わせでこれらを配置する必要があります-

23 * * *
23 M * *
23 M Delhi *
23 M Delhi Muslim
* M * *
* M Delhi *
* M Delhi Muslim
* * Delhi *
* * Delhi Muslim
* * * Muslim
* * * *

これは、リスト内の昇順で次元数で並べ替える必要があります。したがって、1つの値との組み合わせが最上位になります。私は30以上の属性を持っているので、Pythonでこれを行うための自動化された方法が必要です

何か案は ?

4

3 に答える 3

5

次はどうですか:

In [21]: attrib = (23, "M", "Delhi", "Muslim")

In [25]: comb = list(itertools.product(*((a, None) for a in attrib)))

In [26]: comb
Out[26]: 
[(23, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', 'Muslim'),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (23, None, None, None),
 (None, 'M', 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, 'M', None, None),
 (None, None, 'Delhi', 'Muslim'),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (None, None, None, None)]

さて、私があなたのソート要件を正しく理解していれば、以下はそれを行うべきです:

In [27]: sorted(comb, key=lambda x:sum(v is not None for v in x))
Out[27]: 
[(None, None, None, None),
 (23, None, None, None),
 (None, 'M', None, None),
 (None, None, 'Delhi', None),
 (None, None, None, 'Muslim'),
 (23, 'M', None, None),
 (23, None, 'Delhi', None),
 (23, None, None, 'Muslim'),
 (None, 'M', 'Delhi', None),
 (None, 'M', None, 'Muslim'),
 (None, None, 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', None),
 (23, 'M', None, 'Muslim'),
 (23, None, 'Delhi', 'Muslim'),
 (None, 'M', 'Delhi', 'Muslim'),
 (23, 'M', 'Delhi', 'Muslim')]

私はあなたが使用Noneした場所を使用しまし*たが、後者を使用するのは簡単です。

もちろん、30の属性では、最大10億の組み合わせを見ているので、リストのフラット化とその後の並べ替えはおそらく機能しません。しかし、とにかく10億のエントリで何が有効にできるでしょうか。

于 2012-12-04T17:15:05.707 に答える
4

NPEの答えは、メモリ内のサブセットの完全なリストを作成し、それをソートすることによって問題を解決します。これには、O(2 n)スペースとO(n 2  2 n)時間が必要です。これが受け入れられない場合は、O(n)空間とO(n  2 n)時間でサブセットを生成する方法があります。

from itertools import combinations

def subsets(s, placeholder = None):
    """
    Generate the subsets of `s` in order of size.
    Use `placeholder` for missing elements (default: None).
    """
    s = list(s)
    n = len(s)
    r = range(n)
    for i in range(n + 1):
        for c in combinations(r, i):
            result = [placeholder] * n
            for j in c:
                result[j] = s[j]
            yield result

>>> from pprint import pprint
>>> pprint(list(subsets([23, 'M', 'Delhi', 'Muslim'])))
[[None, None, None, None],
 [23, None, None, None],
 [None, 'M', None, None],
 [None, None, 'Delhi', None],
 [None, None, None, 'Muslim'],
 [23, 'M', None, None],
 [23, None, 'Delhi', None],
 [23, None, None, 'Muslim'],
 [None, 'M', 'Delhi', None],
 [None, 'M', None, 'Muslim'],
 [None, None, 'Delhi', 'Muslim'],
 [23, 'M', 'Delhi', None],
 [23, 'M', None, 'Muslim'],
 [23, None, 'Delhi', 'Muslim'],
 [None, 'M', 'Delhi', 'Muslim'],
 [23, 'M', 'Delhi', 'Muslim']]
于 2012-12-04T17:30:55.223 に答える
1

見てくださいitertools、それはのための方法を持っていますcombinations

于 2012-12-04T17:12:10.750 に答える