比较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
执行此任务注意 如果您使用的是Py 3.X,而不是切片,请使用
next
>>> len(set(next(zip(*test)))) == 1
解决办法很简单
zip
执行此任务注意 如果您使用的是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更难阅读