Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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 - Fatal编程技术网

不同类型的Python列表成员资格

不同类型的Python列表成员资格,python,Python,我有各种类型的Python文本列表,例如: literals = [1, 2, 'a', False] 我所说的“literal”是指任何可以作为的输出的Python对象。我想编写一个函数literalInList来检查literals列表中是否有其他Python literalx: x = True if literalInList(x, literals): # Should be False. print('The literal is in the list.') 请注意,我不

我有各种类型的Python文本列表,例如:

literals = [1, 2, 'a', False]
我所说的“literal”是指任何可以作为的输出的Python对象。我想编写一个函数
literalInList
来检查
literals
列表中是否有其他Python literal
x

x = True
if literalInList(x, literals):  # Should be False.
  print('The literal is in the list.')
请注意,我不能只在文本中执行
x,因为
=
中的
运算符不检查文本类型:

>>> True == 1
True
>>> False == 0
True
>>> 1 == 1.0
True
>>> True in [1, 2, 'a', False]
True
因此,我的最佳尝试如下:

def literalInList(x, literals):
  return any(x is lit for lit in literals)
def literalInList(x, literals):
  def eq_x(y):
    return x == y and type(x) is type(y)
  return any(eq_x(y) for y in literals)

literals = [1, 2, 'a', False]
print(literalInList(True, literals))   # False
print(literalInList(False, literals))  # True
print(literalInList(1, literals))      # True
print(literalInList(1.0, literals))    # False

对于一个听起来很简单的任务来说,这无疑是相当丑陋的。有没有一种更优雅、更高效或更像蟒蛇的方式?

以下是什么

def literalInList(x, literals):
  return any(x is lit for lit in literals)
def literalInList(x, literals):
  def eq_x(y):
    return x == y and type(x) is type(y)
  return any(eq_x(y) for y in literals)

literals = [1, 2, 'a', False]
print(literalInList(True, literals))   # False
print(literalInList(False, literals))  # True
print(literalInList(1, literals))      # True
print(literalInList(1.0, literals))    # False

您的列表不包含“文本”,文本是源代码的一个方面,您使用列表文本创建了一个包含各种类型对象的列表。在任何情况下,您都希望检查是否相等以及是否精确,对吗?所以,不接受子类?你必须写一些循环。在任何情况下,(未排序)列表中的成员资格检查都必须是线性的,因此没有更有效的方法,您只需编写正确的条件
is
几乎肯定不是您想要的,除非您总是检查语言保证的单例。注意,
=
对类型很敏感,它只接受子类,
bool
是一个
int
在这里可能很有用,我编辑它是为了澄清这里的“literal”是指任何可能是
ast.literal\u eval
输出的Python对象。我知道,你不能比O(n)最坏的时间更快,但效率仍然可以是一个因素,如果你考虑提前或消除循环有利于内置的操作员。@ PKPND一个快速的例子,<代码> []是[]]/COD>总是错误的,并且<代码> []= []/COD>总是正确的。这是身份和平等之间的区别。阅读本文,以获得更深入的讨论,了解在何处应该以您尝试的方式使用
is
(即,
is
表示平等)@juanpa.arrivillaga:我仔细考虑了这一点,认为
=
既正确(对吗?)又更直观(对我而言)。:)尽管如此,我还是改变了答案,谢谢。这也是正确的。因为一切都是一个
对象
,而
对象.\uuuueq\uuuuu
本质上是一个身份比较,结果是一样的。虽然,我想您可能正在使用一个实现了一些奇怪元类的类,它打破了类相等的语义指导线,但这是一个延伸。在我看来,这更像是一个习惯用语,但实际上,这是一个风格问题,而不是正确性问题。