【问题标题】:Condition if multiple lists are unique条件多个列表是否唯一
【发布时间】:2019-03-28 06:42:03
【问题描述】:

我尝试寻找答案,但找不到正确的答案。 所以假设我有这个:

list=['f','f','f','f','r','r','r','r','b','b','b','b','l','l','l','l','t','t','t','t',
      'u','u','u','u']
c1=[list[0],list[13],list[18]]
c2=[list[1],list[4],list[19]]
c3=[list[5],list[8],list[17]]
c4=[list[9],list[12],list[16]]

#if c1,c2,c3,c4 are unique
#do something

如何比较这 4 个列表是否独一无二?

【问题讨论】:

  • 不要隐藏内置插件。使用合理的变量名称,例如 lstLnot list。此外,精确定义唯一性。顺序重要吗?还是['r', 'b', 'r'] 等同于['b', 'r', 'r']
  • 那么想要的输出是什么?
  • @jpp 是的,但我使用“列表”作为示例。不,顺序无关紧要
  • @U9-Forward 如果至少有两个这样的列表相似,则返回错误消息(无论顺序如何,都具有相同的元素)
  • @Plagga 好吧

标签: python conditional-statements


【解决方案1】:

我通常不喜欢一个班轮,但我相信这应该可行:

if (tuple(c1) != tuple(c2) != tuple(c3) != tuple(c4)):
    print 'All are unique!'
else:
    raise 'Oh no, they are not all unique!'

【讨论】:

  • c1 = list('aab'); c2 = list('abb') 上失败
  • 您不能像以前那样在字符串上调用列表对象,不,如果您像我一样使用集合,我的代码应该适用于这些情况。
  • 是的,我忘记了 OP 一直在隐藏内置函数。然而,您的代码在我演示的用例上失败了,这并不是一个晦涩难懂的边缘案例。
  • set(['a','a','b']) != set(['a','b','b']) 的计算结果为 False,即使这两个集合彼此唯一。
  • 啊,好点子!抱歉,一开始误解了你的意思。
【解决方案2】:

由于顺序无关紧要,您可能需要对子列表进行排序,然后检查其中一组是否与已排序列表的原始列表具有相同的长度:

ordered = [tuple(sorted(l)) for l in [c1, c2, c3, c4]]
# [('f', 'l', 't'), ('f', 'r', 't'), ('b', 'r', 't'), ('b', 'l', 't')]

unique = len(set(ordered)) == len(ordered)
# True 

【讨论】:

    【解决方案3】:
    if max(len(c1), len(c2)) != len(set(c1) & set(c2))\
            and max(len(c1), len(c3)) != len(set(c1) & set(c3))\
            and max(len(c1), len(c4)) != len(set(c1) & set(c4))\
            and max(len(c2), len(c3)) != len(set(c2) & set(c3))\
            and max(len(c3), len(c4)) != len(set(c3) & set(c4)):
        print("Do something.")
    else:
        print("Do something else.")
    

    【讨论】:

    • c1 = ['a','b','b']; c2 = ['a', 'b', 'b'] 失败
    【解决方案4】:

    如果 unique 你的意思是在每个位置不包含相同的值,那么这样的东西应该可以工作:

    if len(set(map(tuple, [c1, c2, c3, c4]))) == 4:
      # All four lists are unique
    

    请注意,在这种情况下,[1,2][2,1] 是不同的。如果出于您的目的,它们是相同的,那么您会想要这个:

    if len(set(map(frozenset, [c1, c2, c3, c4]))) == 4:
      # All four lists are unique
    

    如果您需要 unique 的其他定义,那么您需要更清楚地说明您的要求。

    【讨论】:

    • 顺序无关紧要,我应该更精确。使用frozenset 作品。谢谢
    猜你喜欢
    • 2022-11-26
    • 2019-05-15
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2016-08-06
    • 2013-04-04
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多