Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较python中嵌套列表中列表的第一个元素_Python_List - Fatal编程技术网

比较python中嵌套列表中列表的第一个元素

比较python中嵌套列表中列表的第一个元素,python,list,Python,List,我有如下列表: [[a1,a2], [b1,b2],...., [n1]] 我想知道所有这些列表的第一个元素是否相等 >>> from operator import itemgetter >>> test = [[1, 2], [1, 3], [1, 4]] >>> len(set(map(itemgetter(0), test))) == 1 True >>> test.append([2, 5]) >>

我有如下列表:

[[a1,a2], [b1,b2],....,  [n1]]
我想知道所有这些列表的第一个元素是否相等

>>> from operator import itemgetter
>>> test = [[1, 2], [1, 3], [1, 4]]
>>> len(set(map(itemgetter(0), test))) == 1
True
>>> test.append([2, 5])
>>> test
[[1, 2], [1, 3], [1, 4], [2, 5]]
>>> len(set(map(itemgetter(0), test))) == 1
False
另一种方法是(谢谢你,彼得·德格洛珀!)

这个版本也会短路,所以不需要在任何情况下都检查每个元素。

怎么样

>>> from operator import itemgetter
>>> test = [[1, 2], [1, 3], [1, 4]]
>>> len(set(map(itemgetter(0), test))) == 1
True
>>> test.append([2, 5])
>>> test
[[1, 2], [1, 3], [1, 4], [2, 5]]
>>> len(set(map(itemgetter(0), test))) == 1
False
另一种方法是(谢谢你,彼得·德格洛珀!)


此版本也会短路,因此不需要在每种情况下检查每个元素。

您可以创建第一个元素列表,与第一个子列表的第一个元素进行比较:

False not in [len(yourList[0])>0 and len(x)>0 and x[0] == yourList[0][0] for x in yourList]

您可以创建与第一个子列表的第一个元素相比的第一个元素列表:

False not in [len(yourList[0])>0 and len(x)>0 and x[0] == yourList[0][0] for x in yourList]
使用一个班轮:

>>> sample = [[1, 2], [1, 3], [1, 4]]
>>> reduce(lambda x, y: x if x == y[0] else None, sample, sample[0][0])
1
>>> sample = [[0, 2], [1, 3], [1, 4]]
>>> reduce(lambda x, y: x if x == y[0] else None, sample, sample[0][0])
None
使用一个班轮:

>>> sample = [[1, 2], [1, 3], [1, 4]]
>>> reduce(lambda x, y: x if x == y[0] else None, sample, sample[0][0])
1
>>> sample = [[0, 2], [1, 3], [1, 4]]
>>> reduce(lambda x, y: x if x == y[0] else None, sample, sample[0][0])
None
试试这个

>>> test = [[1, 2], [1, 3], [1, 4]]
>>> eval("==".join(map(lambda x: str(x[0]), test)))
True
试试这个

>>> test = [[1, 2], [1, 3], [1, 4]]
>>> eval("==".join(map(lambda x: str(x[0]), test)))
True

为了可读性,我更喜欢用列表理解来做这件事,除非有理由避免它

list_of_lists = [[1, 2], [1, 3], [1, 4]]
len(set([sublist[0] for sublist in list_of_lists])) == 1
# True

为了可读性,我更喜欢用列表理解来做这件事,除非有理由避免它

list_of_lists = [[1, 2], [1, 3], [1, 4]]
len(set([sublist[0] for sublist in list_of_lists])) == 1
# True

解决办法很简单

  • 把你的名单调换一下。使用
    zip
    执行此任务
  • 为转置列表的第一行编制索引
  • 使用set删除重复项
  • 确定元素数是否等于1

  • 注意

    如果您使用的是Py 3.X,而不是切片,请使用
    next

    >>> len(set(next(zip(*test)))) == 1
    

    解决办法很简单

  • 把你的名单调换一下。使用
    zip
    执行此任务
  • 为转置列表的第一行编制索引
  • 使用set删除重复项
  • 确定元素数是否等于1

  • 注意

    如果您使用的是Py 3.X,而不是切片,请使用
    next

    >>> len(set(next(zip(*test)))) == 1
    

    我认为这更自然地表示为
    all(对于测试中的子列表,子列表[0]==test[0][0])
    。或者,要从一个线性着陆中脱离,
    first=test[0][0];all(子列表[0]==测试中子列表的第一个)
    @PeterDeGlopper:当然。还加了这个!谢谢。我还没有分析过,所以我冒着断言测试时不真实的东西的风险,但是我会惊讶地看到与短路有意义的性能差异。布景构造很快,我不这么认为。对于非常大的列表,集合构造将需要遍历每个元素(即使不正确的元素在开头),然后将它们全部散列。而使用迭代器的
    all
    短路速度更快。这肯定取决于数据,以及与列表输入列表的大小相比,故障出现的时间有多早
    all
    理论上肯定更好,但我认为内置的构造函数更优化。我运行了一个包含1000个长度相同的2元素子列表的快速测试用例,事实上,
    set
    方法完成10k重复的速度是
    all
    方法的两倍-0.75秒,而不是1.5秒。在另一个极端,如果测试[1][0]不同,
    set
    方法显然需要相同的时间,但是
    all
    需要0.03秒。不确定
    all
    获胜的深度。我认为这更自然地表达为
    all(对于测试中的子列表,子列表[0]==test[0][0])
    。或者,要从一个线性着陆中脱离,
    first=test[0][0];all(子列表[0]==测试中子列表的第一个)
    @PeterDeGlopper:当然。还加了这个!谢谢。我还没有分析过,所以我冒着断言测试时不真实的东西的风险,但是我会惊讶地看到与短路有意义的性能差异。布景构造很快,我不这么认为。对于非常大的列表,集合构造将需要遍历每个元素(即使不正确的元素在开头),然后将它们全部散列。而使用迭代器的
    all
    短路速度更快。这肯定取决于数据,以及与列表输入列表的大小相比,故障出现的时间有多早
    all
    理论上肯定更好,但我认为内置的构造函数更优化。我运行了一个包含1000个长度相同的2元素子列表的快速测试用例,事实上,
    set
    方法完成10k重复的速度是
    all
    方法的两倍-0.75秒,而不是1.5秒。在另一个极端,如果测试[1][0]不同,
    set
    方法显然需要相同的时间,但是
    all
    需要0.03秒。不确定
    all
    获胜的深度。有很多方法可以做到这一点,我不可能看到批准使用
    eval
    ,这是不安全的,除非运行完全受信任的输入。这种情况下的输入可能是可信的,但是
    eval
    完全没有必要。如果您想安全地实现此方法,请使用
    reduce(operator.eq,(map(operator.itemgetter(0),test))
    。或
    reduce(operator.eq,(子列表[0]用于测试中的子列表))
    。我认为两者都比
    all
    set
    方法更难阅读,但至少它们是安全的。@Peter DeGlopper:是的。。。使用
    eval
    是不安全的。我不关心安全性,因为我在这个例子中不是认真的,但我只是觉得这段代码有点可读性。另外一种使用
    操作符.eq
    的方法非常好。我不知道。谢谢。:)有很多方法可以做到这一点,我不可能看到批准使用
    eval
    ,这是不安全的,除非运行完全受信任的输入。这种情况下的输入可能是可信的,但是
    eval
    完全没有必要。如果您想安全地实现此方法,请使用
    reduce(operator.eq,(map(operator.itemgetter(0),test))
    。或
    reduce(operator.eq,(子列表[0]用于测试中的子列表))
    。我认为两者都比
    all
    set
    ap更难阅读