我有一个大型列表,其中包含带有文本的坐标值。列表中元素的格式如下所示,它显示元素的索引,x co ord,y co ord和文本值。
我希望列表中的数字元素与其特定的文本值对齐。例如,
(1,(85,604,' 1 _'))
(2,(85,604,' 2 _'))
(3,(102,604,' 1s Text'))
(4,(102,445,' 2s Text'))
结果列表应该是:
(' 1 _' 1s文字')
(' 2 _' 2s文字)
我在原始列表中搜索一开始就在84-86范围内的元素,这些元素具有特定的正则表达式格式,该格式提取所有在行开头都有数字的元素,并且' _'
这是我遍历列表的方式:
for i in enumerate(row):
regex = r"(^\d+\s\_)"
if i[1][0] in range(84,86) and i[1][1] in range(44, 230):
if re.match(regex, i[1][2], re.MULTILINE):
//So for the elements that meet this condition above^
I then want to find the next value that has the range(101,103)
//I have tried the following but I know this is not the right way to do it
next(i[1][2] for l in i if i[1][0] in range(101,103)
如果一个元素满足这个条件,那么我想要搜索i [1] [0]的值在101-103范围内的最近元素。
例如
(1,(85,604,' 1 _'))
(2,(85,604,' 2 _'))
(3,(102,604,' Text'))
(4,(102,445,' Text'))
因此对于原始条件,这将获得索引1的值(85,604,' 1 _')然后我希望我的代码然后获得索引3的值(102,604, ' 3 _')因为它是102的下一个值,索引2应该与索引4对齐。
我当前的代码将索引2与索引3对齐,这不是我想要的。
有人可以帮助我迭代这个列表,这样一旦找到原始条件,它就会找到下一个102元素,因此文本与正确的数字对齐。
答案 0 :(得分:0)
如果您将数据结构转换为专为搜索而设计的内容,那么这个问题将更容易解决并且运行速度更快 - 因此您不必一遍又一遍地遍历整个列表。但是,坚持你所拥有的:
要找到匹配新条件的找到行之后的第一个值,我们可以在找到的行之后开始遍历列表。
john 3
ron 2
kyle 1
顺便说一句,你循环的方式非常奇怪。 for i in enumerate(row):
regex = r"(^\d+\s\_)"
if i[1][0] in range(84,86) and i[1][1] in range(44, 230):
if re.match(regex, i[1][2], re.MULTILINE):
for j in enumerate(row[i[0]+1:], i[0]+1):
if j[1][0] in range(101, 103):
# do stuff with j
break
else:
# handle the case where there was no match
函数的设计使用方式如下:
enumerate
然后,您不需要在for index, value in enumerate(row):
和i[0]
使用i[1]
和index
。
或者,如果您根本不需要value
(index
),请不要使用i[0]
:
enumerate
同时,在您的情况下,您可能想要解压缩值,而不仅仅是索引和值
因此,更可读的写作方式是:
for value in row: