我想在列表中找到对象的下一个实例,并返回它的索引值



我有一个包含以下数据的文件:

0.00006598 0.00006591 0.00006617 0.00006555 0.00006550 0.00006557 0.00006555 0.00006564 0.00006586 0.00006591 0.00006621 0.00006623 0.00006597 0.00006606 0.00006624 0.00006553 0.00006589 0.00006586 0.00006610 0.00006610 0.00006611 0.00006598 0.00006598 0.00006591 0.00006608 0.00006600 0.00006600 0.00006600

完整列表包含数百行。

我想找到相同值的下一个实例的索引。

因此,如果我采用此列表中的第一个条目 0.00006598,我想遍历列表,并返回下一个实例 0.00006598 的索引值。

到达下一个实例后,使用第二个实例查找第三个实例,依此类推。我想为列表中的每个唯一值执行此操作。

我已经能够使用以下方法确定列表中每个值的实例数:

with open("testdata.txt", "r+") as f:
lines = f.read().splitlines()
for num, line in enumerate(lines):
occurrences = lines.count(line)
print(str(line) + "   " + str(occurrences) + "   " + str(num))

我的目的是找到所有值的索引之间的最大差异。

最好的方法是什么?

>collections.defaultdict救援 - 收集每个值的每个行号,然后处理它们。这将适用于非常大的文件(或非常大量的非重复值(:

from collections import defaultdict
import io
# test data, simulating a file (this could just as well be the open file)
test_data = io.StringIO(
"""
0.00006598
0.00006591
0.00006617
0.00006555
0.00006550
0.00006557
0.00006555
0.00006564
0.00006586
0.00006591
0.00006621
0.00006623
0.00006597
0.00006606
0.00006624
0.00006553
0.00006589
0.00006586
0.00006610
0.00006610
0.00006611
0.00006598
0.00006598
0.00006591
0.00006608
0.00006600
0.00006600
0.00006600
""".strip()
)
occurrences = defaultdict(list)
for lineno, value in enumerate(test_data):
occurrences[value.strip()].append(lineno)
for value, linenos in occurrences.items():
largest_diff = max(linenos) - min(linenos)
if largest_diff:
print(value, linenos, largest_diff)

打印出来,例如

> python so62755020.py
0.00006598 [0, 21, 22] 22
0.00006591 [1, 9, 23] 22
0.00006555 [3, 6] 3
0.00006586 [8, 17] 9
0.00006610 [18, 19] 1
0.00006600 [25, 26, 27] 2

编辑:要回复评论,要获得按最大差异排序的列表,

sorted_occ = sorted(
(
(value, max(linenos) - min(linenos))
for value, linenos in occurrences.items()
),
key=lambda pair: pair[1],
reverse=True,
)
for value, largest_diff in sorted_occ:
print(value, largest_diff)

输出

0.00006598 22
0.00006591 22
0.00006586 9
0.00006555 3
0.00006600 2
0.00006610 1
...

最新更新