假设我有一袋物品{a, b}
。然后我可以用各种方法从中选择成对的物品。一种方法可能是选择所有可能的排列:[a, a], [a, b], [b, a], [b, b]
。但我可能不允许重复,在这种情况下可能的排列是:[a, b], [b, a]
。我可能会进一步声明与[a, b]
相同[b, a]
,即我只关心选择的“组合”,而不是它们的排列。
有关组合与排列之间的区别的更多信息,请参阅:https://en.wikipedia.org/wiki/Combination
产生选择组合的最佳方法是什么(即元素的顺序无关紧要)?我当前的解决方案如下:
import polars as pl
choices = pl.DataFrame(
[
pl.Series("flavor", ["x"] * 2 + ["y"] * 3),
pl.Series("choice", ["a", "b"] + ["1", "2", "3"]),
]
)
# join to produce the choices
choices.join(choices, on=["flavor"]).with_columns(
# generate a 2-element list representing the choice
sorted_choice_pair=pl.concat_list("choice", "choice_right").list.sort()
).filter(pl.col.choice.eq(pl.col.sorted_choice_pair.list.first()))
shape: (9, 4)
┌────────┬────────┬──────────────┬────────────────────┐
│ flavor ┆ choice ┆ choice_right ┆ sorted_choice_pair │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str ┆ list[str] │
╞════════╪════════╪══════════════╪════════════════════╡
│ x ┆ a ┆ a ┆ ["a", "a"] │
│ x ┆ a ┆ b ┆ ["a", "b"] │
│ x ┆ b ┆ b ┆ ["b", "b"] │
│ y ┆ 1 ┆ 1 ┆ ["1", "1"] │
│ y ┆ 1 ┆ 2 ┆ ["1", "2"] │
│ y ┆ 2 ┆ 2 ┆ ["2", "2"] │
│ y ┆ 1 ┆ 3 ┆ ["1", "3"] │
│ y ┆ 2 ┆ 3 ┆ ["2", "3"] │
│ y ┆ 3 ┆ 3 ┆ ["3", "3"] │
└────────┴────────┴──────────────┴────────────────────┘
因此我生成所有排列,然后过滤掉“左元素”与列表第一个元素不匹配的排列。
您可以使用
.join_where()
行索引谓词来防止“重复”。