根据前两个元素

时间:2018-04-09 21:31:57

标签: python

我有一个中等长度的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>

2 个答案:

答案 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