python - 列表元素与条件的 Python 组合
问题描述
itertools.combinations()
我在python中找到函数的源代码。它看起来像这样。
def combinations(iterable, r):
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
print(indices)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
print(indices)
yield tuple(pool[i] for i in indices)
我有这样的元组:
pairs = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
我需要生成所有可能组合的四人组,但条件是,列表中总是只有两个相同的数字。所以在这种情况下,我想生成这 3 个列表:
((0, 1), (0, 2), (1, 3), (2, 3))
((0, 1), (0, 3), (1, 2), (2, 3))
((0, 2), (0, 3), (1, 2), (1, 3))
我真正需要的是更新生成组合的代码,因为在我的真实应用程序中,我需要从 80 个元组生成 23-nties。生成和过滤之后会花费很多时间,这就是为什么我需要在生成的一部分中发现问题。
解决方案
您可以使用itertools.combinations
,然后使用过滤结果collections.Counter
:
from collections import Counter
import itertools as it
pairs = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
result = filter(
lambda x: max(Counter(it.chain(*x)).values()) < 3,
it.combinations(pairs, 4)
)
print(list(result))
输出:
[((0, 1), (0, 2), (1, 3), (2, 3)),
((0, 1), (0, 3), (1, 2), (2, 3)),
((0, 2), (0, 3), (1, 2), (1, 3))]
推荐阅读
- css - Grid areas are not positioning as defined in grid-template-areas
- javascript - redux-saga api yield call works, but no data returned
- xamarin.forms - Maintaining UWP Certificates With Xamarin Forms
- docker - Why nginx are required to be run on docker sometimes?
- html - I added an image that for some reason adds a scroll bar. I also have an issue with a text element
- javascript - Unable to open HTML link from HTML homepage
- python - 使用 pandas 将附加标题转换为列
- java - Why generic array creation works in some circumstances
- arrays - Multiple conditions in an array
- php - This query works on mysql but returns 0 on PHP (inverted order works though)