有一个数组,想求出所有两两配对的情况,用python怎么写比较优雅
比如输入数组是[1,2,3,4]
- 情况1
1和2配对,3和4配对 - 情况2
1和3配对,2和4配对 - 情况3
1和4配对,2和3配对
把这三种情况都求出来,两两配对没有先后顺序
- 输入
a=[1,2,3,4]
- 输出
[
[[1, 2], [3, 4]],
[[1, 3], [2, 4]],
[[1, 4], [2, 3]]
]
有一个数组,想求出所有两两配对的情况,用python怎么写比较优雅
比如输入数组是[1,2,3,4]
把这三种情况都求出来,两两配对没有先后顺序
a=[1,2,3,4]
[
[[1, 2], [3, 4]],
[[1, 3], [2, 4]],
[[1, 4], [2, 3]]
]
这就是个dfs
ans = []
lst = [1,2,3,4]
def dfs(lst, tmp):
if 2 == len(tmp):
ans.append(tmp)
return
for i in range(len(lst)):
dfs(lst[i+1:], tmp + [lst[i]])
dfs(lst, [])
不知道怎么才算比较优雅,试了一下可以这样:
def dfs(ls, r=2):
c = []
rs = []
for x in itertools.combinations(ls, r):
c.append(list(x))
for i, j in itertools.combinations(c, r=2):
x_set = set()
x_set.update(i)
x_set.update(j)
x_rs = []
if len(ls) == len(x_set):
x_rs.append(i)
x_rs.append(j)
rs.append(x_rs)
return rs
print("[1, 2, 3, 4]的结果=>", dfs(ls=[1, 2, 3, 4], r=2))
print("[1, 2, 3, 4, 5, 6]的结果=>", dfs(ls=[1, 2, 3, 4, 5, 6], r=3))
结果:
[1, 2, 3, 4]的结果=> [[[1, 2], [3, 4]], [[1, 3], [2, 4]], [[1, 4], [2, 3]]]
[1, 2, 3, 4, 5, 6]的结果=> [[[1, 2, 3], [4, 5, 6]], [[1, 2, 4], [3, 5, 6]], [[1, 2, 5], [3, 4, 6]], [[1, 2, 6], [3, 4, 5]], [[1, 3, 4], [2, 5, 6]], [[1, 3, 5], [2, 4, 6]], [[1, 3, 6], [2, 4, 5]], [[1, 4, 5], [2, 3, 6]], [[1, 4, 6], [2, 3, 5]], [[1, 5, 6], [2, 3, 4]]]
想了半天,for语句不知道怎么去掉,有点不优雅。
a = [1, 2, 3, 4]
b = []
for i in range(1, len(a)):
b += zip(a[:-i], a[i:])
b = [list(item) for item in b]
print(b)
不知道结果是否符合要求。
[[1, 2], [2, 3], [3, 4], [1, 3], [2, 4], [1, 4]]
4 回答4.5k 阅读✓ 已解决
1 回答3.3k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
出处