python 复杂类型列表的问题
Issue with python list for complex types
下面是 Python 中的代码片段,它将 IP 前缀存储在基数树中,然后在字典中关联 IP 和 ASN(如果 IP 属于前缀)。
我想找出特定前缀的所有不同 ASN。更多详情如下:
#rtree is a radix tree which has prefixes stored.
rtree = radix.Radix()
with open(path-to-prefix-file,'r') as fp:
for line in fp:
rnode = rtree.add(line) # Eg, Prefixes like "192.168.2.0/24"
rnode.data["count"]= 0
...
# The code has several lines here for processing a capnproto - skipping them.
rnode.data[IP]=asn_complete # I read a Capnproto buffer and store IP and asn_complete
...
for rnode in rtree:
seen_list = [] # defining a list to store different val, i.e.,asn_complete values
if rnode.data["count"] > 1:
""" Iterate through the rnode.data dictionary """
for ip,val in rnode.data.iteritems():
if val not in seen_list: # Condition is always satisfied!!
seen_list.append(val)
例如:val
在几次迭代中从 protobuf 中获得以下值:
[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>]
当我打印出 seen_list
时:
[[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>],....]
显然 val
在 seen_list
中;但是,if val not in seen_list:
始终为真,并且 val
多次附加到 seen_list
。我不明白为什么条件总是 returns 为真。是因为 seen_list
中存储的对象类型吗?
目前,Cap'n Proto 阅读器不支持任何形式的 "equality" 比较。部分原因是不清楚平等的含义是什么:应该是身份(如果两个读者指向完全相同的对象,那么他们是平等的)还是应该是价值的(如果他们指向具有相同内容的对象,他们是平等的)?
在任何情况下,in
都需要 __eq__
的实现来测试是否相等,而在 Cap'n Proto 的情况下没有这样的实现。可能最终发生的是 Python 正在按身份比较包装对象——并且随着不断创建新的包装对象,这些比较总是错误的。
为了得到你想要的东西,你可能需要将 Cap'n Proto 对象完全转换为可以适当比较的普通 Python 对象。
下面是 Python 中的代码片段,它将 IP 前缀存储在基数树中,然后在字典中关联 IP 和 ASN(如果 IP 属于前缀)。
我想找出特定前缀的所有不同 ASN。更多详情如下:
#rtree is a radix tree which has prefixes stored.
rtree = radix.Radix()
with open(path-to-prefix-file,'r') as fp:
for line in fp:
rnode = rtree.add(line) # Eg, Prefixes like "192.168.2.0/24"
rnode.data["count"]= 0
...
# The code has several lines here for processing a capnproto - skipping them.
rnode.data[IP]=asn_complete # I read a Capnproto buffer and store IP and asn_complete
...
for rnode in rtree:
seen_list = [] # defining a list to store different val, i.e.,asn_complete values
if rnode.data["count"] > 1:
""" Iterate through the rnode.data dictionary """
for ip,val in rnode.data.iteritems():
if val not in seen_list: # Condition is always satisfied!!
seen_list.append(val)
例如:val
在几次迭代中从 protobuf 中获得以下值:
[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>]
当我打印出 seen_list
时:
[[<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>], [<capnp list reader [15169]>, <capnp list reader [1239]>, <capnp list reader [4837]>],....]
显然 val
在 seen_list
中;但是,if val not in seen_list:
始终为真,并且 val
多次附加到 seen_list
。我不明白为什么条件总是 returns 为真。是因为 seen_list
中存储的对象类型吗?
目前,Cap'n Proto 阅读器不支持任何形式的 "equality" 比较。部分原因是不清楚平等的含义是什么:应该是身份(如果两个读者指向完全相同的对象,那么他们是平等的)还是应该是价值的(如果他们指向具有相同内容的对象,他们是平等的)?
在任何情况下,in
都需要 __eq__
的实现来测试是否相等,而在 Cap'n Proto 的情况下没有这样的实现。可能最终发生的是 Python 正在按身份比较包装对象——并且随着不断创建新的包装对象,这些比较总是错误的。
为了得到你想要的东西,你可能需要将 Cap'n Proto 对象完全转换为可以适当比较的普通 Python 对象。