【发布时间】:2022-12-17 19:30:50
【问题描述】:
我在列表中有两个元组,我想在其中比较它们的第二个元素。 这样做的惯用方式是什么?
【问题讨论】:
-
列表的大小是否总是为 2 而要考虑的元素总是排在第二位还是它们可以变化?
-
一种更优雅的方式......我不这么认为。就这样保持下去吧,它简单易懂。
-
也许如果我们看到上下文,我们可以展示更好的东西。但在没有上下文的情况下,我同意@Shinra tensei 的观点。
-
是的,我只是又多了一个想法似乎更优雅。
我在列表中有两个元组,我想在其中比较它们的第二个元素。 这样做的惯用方式是什么?
【问题讨论】:
我认为只要代码的读者清楚 results 的内容是什么,您编写的代码就是最“优雅”或易于阅读的代码。如果你想给他提供更多提示(例如results 的内容可能会让人混淆等),你可以在结果中命名变量:
(_, height_a), (_, height_b) = results
height_a == height_b
请注意,这仅在 results 是一对时才有效,如果结果中有多对,您可以通过以下方式解决:
(_, height_a), (_, height_b), *_ = results
【讨论】:
OK,目前有5种可能:
import timeit
results = [(3, 2), (1, 2)]
print("#1", timeit.timeit(
'''(_, a), (_, b) = results
a == b''',
globals=globals(), number=10000000))
print("#2", timeit.timeit(
'''(_, a), (_, b), *_ = results
a == b''',
globals=globals(), number=10000000))
print("#3", timeit.timeit(
'''results[0][1] == results[1][1]''',
globals=globals(), number=10000000))
print("#4", timeit.timeit(
'''len({r[1] for r in results}) == 1''',
globals=globals(), number=10000000))
print("#5", timeit.timeit(
"len(set(list(zip(*results))[1])) == 1",
globals=globals(), number=10000000))
除非我做错了什么,否则第一种方法在 2 元组列表的情况下是最快的,否则就使用你拥有的
#1 0.6181712869999999
#2 1.597160365
#3 1.093676446
#4 3.0940490819999997
#5 4.806052006
【讨论】:
len({r[1] for r in results}) == 1(不好,但恕我直言,更好的解决方案)。