我有一个中等长度的Python列表,如下所示(显示前5行):
In [4]: dfdist_list[:5]
Out[4]:
[[10255, 10256, (-89.572, 41.235), (-89.025, 41.431000000000004), 37.963909],
[10255, 937, (-89.572, 41.235), (-101.209, 36.184), 11622.426262],
[10255, 3392, (-89.572, 41.235), (-101.221, 36.008), 11621.601622],
[10255, 306, (-89.572, 41.235), (-101.53399999999999, 36.241), 11599.87664],
[10255, 7313, (-89.572, 41.235), (-103.331, 35.109), 11475.272909]]
列表的前两列是开始和结束节点的ID号(顺序并不重要)。接下来的两列是节点的地理坐标。最后一列是节点之间计算的英里距离。
我正在循环CSV文件以创建此列表。但是对于每个循环,在执行计算之前,我想检查列表中是否已经有一行具有相同的节点,但顺序相反。 (如果是这样,那么我将跳过添加新行,因为该数据已经在那里。)
检查列中是否存在行的最清晰/最简单的方法是什么?您知道该行的前两个元素是什么?
更新:特别是,我尝试了以下似乎应该可以工作,但我不能让它吐出一个真/假。它只是吐出生成器对象行:
In [18]: any([indexY,indexX] in subl[:2] for subl in dfdist_list)
Out[18]: <generator object <genexpr> at 0x000000000A902FC0>
答案 0 :(得分:1)
在构建set
时保持并行list
。像这样:
#UNTESTED
existing_lines = set()
distances = []
for line in csv_file:
t = tuple(sorted(line[0:2]))
if t not in existing_lines:
distances.append(line)
existing_lines.add(t)
答案 1 :(得分:0)
如果您有一个列表,那么您可以检查是否有其他内容:
test_list = [
(10255, 10256),
(10255, 937),
(10255, 3392),
(10255, 306),
]
print (10255, 10256)[::-1] in test_list
test_list += [(10256, 10255)]
print (10255, 10256)[::-1] in test_list
输出:
False
True