【问题标题】:list of lists with pairs that do not have a match in the original set具有在原始集合中不匹配的对的列表列表
【发布时间】:2018-08-20 12:15:17
【问题描述】:

我有一组列表形式的元组:

[(1, 2), (3, 4), (5, 6), (7, 8)]

这样的顺序没必要,也可以:

[(1, 4), (2, 6), (3, 5), (7, 8)]

这些列表有两个属性:

  • 如果排序和展平,它们会变成从 1 到 n 的范围(如 [1, 2, 3,..n]
  • n是偶数
  • n 大于 2

  • 所有值都是唯一的(没有重复值)。

所以,假设我有:

a = [(1, 2), (3, 4), (5, 6), (7, 8)]

有什么方法可以从a 中创建元组列表b 以使其中没有原始元组?

例如

b = [(1, 8), (3, 7), (2, 6), (4, 5)]

没问题,但是

b = [(1, 2), (3, 7), (5, 6), (4, 8)]

不行,因为它包含a中的(1, 2)(5, 6)

PS:(标题乱七八糟,但我不知道如何更好地解释(将很乐意编辑)。

【问题讨论】:

  • 天真的方法:展平、逐个旋转、重新分块。
  • 你好。你想要一种方法来创建一个列表 b 吗?还是您想要一种创建所有此类列表的方法?或者,最后,只有 m 个(如果它们存在的话)?
  • @Lorenzo:只要一份满足这些条件的清单就足够了
  • 那么@schwobaseggl 的回答就足够了。

标签: python combinations list-comprehension


【解决方案1】:

基于我的幼稚方法评论:

a = [(1, 2), (3, 4), (5, 6), (7, 8)]
b = [(x[1], y[0]) for x, y in zip(a, a[1:]+a[:1])]
# [(2, 3), (4, 5), (6, 7), (8, 1)]

这将相邻对中的元素配对,从而保证原始列表中没有任何对

【讨论】:

  • 这应该没问题,只是他提供的示例似乎具有递增顺序的元组。不确定这是否重要。
  • 我相信这是成功的。
  • @RushabhMehta 如果重要,您可以随时对结果进行排序。
  • 这很可爱。让人想起著名的对角斜线证明。
【解决方案2】:

这是一个使用collections.dequeitertools 的想法。这个想法是展平,旋转,然后分成对。假设您不需要对结果进行任何排序。

a = [(1, 2), (3, 4), (5, 6), (7, 8)]

from itertools import chain, islice
from collections import deque

dq = deque(chain.from_iterable(a))
dq.rotate()

res = list(zip(islice(dq, 0, None, 2), islice(dq, 1, None, 2)))

print(res)

[(8, 1), (2, 3), (4, 5), (6, 7)]

【讨论】:

  • 尽管它很冗长,但这可能是我的方法更有效和更高效的实现。 res = [(dq.popleft(), dq.popleft()) for _ in range(len(dq)/2)] 短了一个字节,为您节省了一种实用方法;)
  • @schwobaseggl,感谢您的赞赏 :)。是的,我知道它很冗长,但也很“懒惰”!
  • @schwobaseggl 或者甚至更短,无需任何工具:res = [(a[i-1][1],a[i][0]) for i in range(len(a))]
  • @NickA 但如果我也在逗号后面的空格上作弊的话,那将和我的答案一样长。实际上更长的时间
  • @schwobaseggl 这次你赢了 ;)
【解决方案3】:

嗯,这是一个。不过我可能误解了你原来的问题。

l = [(1, 2), (3, 4), (5, 6), (7, 8)]
m = max(itertools.chain(*l)) # Largest number in input
nos = range(1, m) # List of numbers we can pick from.
all_tuples = set(itertools.combinations(nos, 2)) # All possible tuples
not_in_original = all_tuples - set(l)

这是一个测试

[x in l for x in not_in_original]
[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]

【讨论】:

  • 我觉得这里少了一个步骤,或者什么。 not_in_original 包含 (1,2) 等内容,在原版中。
  • @Kevin 愚蠢的我。忘了从all_tuples 中减去那些。固定。
  • 好的,看起来好多了:-) 但是not_in_original 仍然与我解释的所需输出不太匹配。我希望它是一个元组,而不是一个集合;并且长度为 4,而不是 18。
  • 好吧,我们可以把它转换回一个列表。
  • 如果你说“那么你可以做result = tuple(not_in_original)[:4] 并满足类型和长度要求”,我认为结果需要满足所有问题中的要点中的属性。在我的机器上,tuple(not_in_original)[:4] 给了我((4, 7), (1, 3), (5, 6), (1, 6)),这违反了“没有重复值”属性。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2014-11-20
  • 2013-02-28
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多