DataQuest在Python中构建一个唯一列表

2024-04-20 13:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做关于数据请求.io. 航空公司的目标是创建一个独特的航班延误表。在

#setting up empty lists
delays_by_carrier = {}
unique_carriers = []
#formula that returns column number based on column name
carrier_column = column_number_from_name("carrier")

for row in flight_delays:
    if row[carrier_column] in unique_carriers == False:
        unique_carriers.append(row[carrier_column])
print (unique_carriers)

print(unique_carriers)命令返回一个空列表,而我期望得到一个唯一载体的列表。有人能解释一下吗?在

仅供参考-我设法用另一种方法解决了这个问题。我还是有兴趣看看我该怎么解决这个问题!在


Tags: 数据nameinionumber目标列表column
2条回答

谢谢你的回答。为了继续,以下解决方案本应有效:

if row[carrier_column] not in unique_carriers:

^{pr2}$

关于为什么我的代码不起作用的解释我有点糊涂了。但我现在明白了我创建的测试的复杂性,确保我会首先找到一个优雅的解决方案。在

谨致问候

代码中的问题是测试。您想检查承运人是否还未进入unique_carriers,但您的测试有点奇怪。在任何情况下,都应该避免在测试中比较布尔值,因为测试已经是布尔值的比较。简单的表达式是:

if row[carrier_column] not in unique_carriers:
    ...

你想写的是:

^{pr2}$

这本可以奏效的(但不雅观)。你也可以写not (row[carrier_column] in unique_carriers)。在

你的问题中有趣的是实际发生了什么。这不是关于运算符优先级的问题:您的代码不会被解释为row[carrier_column] in (unique_carriers == False),这将引发一个TypeError异常,声明您不能将in运算符与布尔值一起使用。在

不,在Python中,您可以chain comparisons,例如x < y < z,而{}和{}都是这种意义上的比较。因此你的陈述被解释为(row[carrier_column] in unique_carriers) and (unique_carriers == False)。在

你可以用字节码来确认。这里我做一个简单的函数,看看Python将如何处理它:

>>> def f():
...     if row[carrier_column] in unique_carriers == False:
...         pass
...     

然后,让我们看看字节码!在

>>> dis.dis(f)
2         0 LOAD_GLOBAL              0 (row)
          3 LOAD_GLOBAL              1 (carrier_column)
          6 BINARY_SUBSCR
          7 LOAD_GLOBAL              2 (unique_carriers)
         10 DUP_TOP
         11 ROT_THREE
         12 COMPARE_OP               6 (in)
         15 JUMP_IF_FALSE_OR_POP    27
         18 LOAD_CONST               1 (False)
         21 COMPARE_OP               2 (==)
         24 JUMP_FORWARD             2 (to 29)
    >>   27 ROT_TWO
         28 POP_TOP
    >>   29 POP_JUMP_IF_FALSE       35

3        32 JUMP_FORWARD             0 (to 35)
    >>   35 LOAD_CONST               0 (None)
         38 RETURN_VALUE

10处,您可以看到复制堆栈顶部的DUP_TOP,该堆栈当时就是列表。然后ROT_THREE旋转堆栈,这样您就可以得到:

unique_carriers
row[carrier_column]
unique_carriers

现在使用in12)进行第一次比较,如果True继续{}和{}来比较剩下的内容(unique_carriers,因为其他2个在比较中被弹出)与False。就这样,你的测试是:

if row[carrier_column] in unique_carriers:
    if unique_carriers == False:
        # do something

相关问题 更多 >