抱歉,标题令人迷惑。例如,我有一个列表:[a, b, c, d]
我想以这种格式生成具有不同组合的排名列表:
[a]
[b]
[c]
[d]
[a, b]
[a, c]
[a, d]
[a, b, c]
[a, b, d]
[a, b, c, d]
我在生成此列表时遇到了麻烦。到目前为止,我首先要做的是通过每次迭代添加一个元素来生成每个列表:
[]
[a]
[a, b]
[a, b, c]
然后,我生成了排名列表的长度:
[]
[]
[]
[]
[a]
[a]
[a]
[a, b]
[a, b]
[a, b, c]
现在我被困在这里。 Python中是否有一个允许我执行此操作的库,或者您只能在代码中手动执行此操作?我要做的最后一件事是从我在顶部生成的原始列表中追加一对一的列表。
这是我尝试过的代码,假设original_list
是我在顶部创建的原始列表,而new_list
是我在此文本上方生成的列表:
for x in range(0, len(original_list)):
new_list[x].append(original_list[x])
这显然不起作用,因为它会将original_list
中的每个项目附加到new_list
中的前4个项目中。
编辑:元素应该是字母顺序的,只有最后一个元素具有不同的组合,没有重复的元素,因为我正在尝试21个项目的列表。
答案 0 :(得分:1)
使用itertools recipes中的Powerset配方,您可以执行以下操作:
IDictionary<string, Vector3> locations = new Dictionary<string, Vector3>()
{
{"A1", Vector3(0.0f, 0.0f, 0.0f)},
{"A2", Vector3(0.0f, 0.0f, 10.0f)}
};
输出
from itertools import chain, combinations
def powerset(iterable):
s = list(iterable)
it = chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
return map(list, (e for e in it if e))
result = sorted(powerset(['a', 'b', 'c', 'd']), key=lambda x: (len(x), ''.join(x)))
for s in result:
print(s)
更新
鉴于您可以执行的更新要求:
['a']
['b']
['c']
['d']
['a', 'b']
['a', 'c']
['a', 'd']
['b', 'c']
['b', 'd']
['c', 'd']
['a', 'b', 'c']
['a', 'b', 'd']
['a', 'c', 'd']
['b', 'c', 'd']
['a', 'b', 'c', 'd']
输出
lst = ['a', 'b', 'c', 'd']
length = len(lst)
def patterns(l):
for i in range(length):
for c in l[i:]:
yield l[:i] + [c]
for pattern in sorted(patterns(lst), key=lambda x: (len(x), ''.join(x))):
print(pattern)
答案 1 :(得分:1)
通过简单的迭代遍历,将所需的列表追加到新列表中:
lst = ['a', 'b', 'c', 'd', 'e']
nlst = []
for i in range(len(lst)):
for y in lst[i:]:
nlst.append(lst[:i] + list(y))
for x in nlst:
print(x)
# ['a']
# ['b']
# ['c']
# ['d']
# ['e']
# ['a', 'b']
# ['a', 'c']
# ['a', 'd']
# ['a', 'e']
# ['a', 'b', 'c']
# ['a', 'b', 'd']
# ['a', 'b', 'e']
# ['a', 'b', 'c', 'd']
# ['a', 'b', 'c', 'e']
# ['a', 'b', 'c', 'd', 'e']
答案 2 :(得分:0)
尝试一下:
from itertools import combinations
a = ['a', 'b', 'c', 'd']
result = [list(combinations(a,i))for i in range(1,len(a)+1)]
并进行如下打印:
for i in result:
print(*list(i), sep='\n')