如何解决如果元组中的第二项是连续的,Python 从元组中提取索引
我有一个由我在另一个列表中的一些项目生成的元组列表。如果第二个元组项是连续的,我想在列表中获取索引(元组中的第一项)。
例如名为“已处理”的列表
[(1,'Chip 1'),(1,'Chip 2'),'Chip 3'),(2,'Chip 4'),(4,(5,'Chip 5'),(7,(8,(10,(12,(14,(16,(18,(20,(23,(25,(27,'Chip 2')]
我可以通过使用 more_itertools
获取顺序列表中的筹码,但我不知道如何进一步处理。有人可以帮我弄清楚吗?
import more_itertools as mit
chip_nums = [int(p[1][-1]) for p in processed]
for group in mit.consecutive_groups(chip_nums):
print(list(group))
[1,2,3,4]
[1,4,5]
[1,3]
[1,2]
[1]
[1,2]
[1,4]
[1]
[1]
[1,2]
解决方法
groups
包含连续的 processed
列表中元素的索引(包括开始和结束)。
注意:某些元组包含相同/相等的开始和结束值,这表示没有连续性。
groups = []
start = 0
for i in range(len(processed) - 1):
if int(processed[i][1].split()[-1]) + 1 == int(
processed[i + 1][1].split()[-1]
): # checks if the next element is 1 greater than previous element
pass
else:
groups.append((start,i)) # stores the start and ending index of a continuous group
start = i + 1
groups.append((start,i + 1)) # this handles the last remaining element
index_list = [[item[0] for item in processed[start : end + 1]] for start,end in groups]
输出:
[[1,1,2],[4,4,5],[7,7,8],[10,10,10],[12,12],[14],[16,16],[18,18],[20,20,20],[23],[25],[27,27]]
,
你可以这样做:
(你会在代码后面找到解释)
from itertools import groupby
from operator import itemgetter
# PART 1
# List that will contain lists of indexes of "chip_nums".
# Each list of indexes will correspond to consecutive chips values
list_of_indexes =list()
for k,g in groupby(enumerate(chip_nums),lambda x:x[0]-x[1]):
group = (map(itemgetter(0),g))
group = list(map(int,group))
list_of_indexes.append(group)
# PART 2
# From the retrieved indexes,get fist value in tuple ("index in tuple")
list_of_indexes_contained_in_tuples = list()
for indexes in list_of_indexes:
consecutive_indexes = list()
for index in indexes:
tuple_in_processed = processed[index]
index_in_tuple = tuple_in_processed[0]
consecutive_indexes.append(index_in_tuple)
list_of_indexes_contained_in_tuples.append(consecutive_indexes)
print(list_of_indexes_contained_in_tuples)
输出:
[[1,27]]
说明:
“PART 1”是 consecutive_groups
函数 more_itertools
的修改版本。
我不知道你是否知道,consecutive_groups
(https://github.com/more-itertools/more-itertools/blob/master/more_itertools/more.py) 的源代码是这个配方的一个实现,你可以在 Python.org 上找到:https://docs.python.org/2.6/library/itertools.html#examples
这个秘籍最初是用 Python 2.6 编写的:
from operator import itemgetter
from itertools import groupby
data = [2,3,5,12,13,14,15,16,17]
for k,g in groupby(enumerate(data),lambda (i,x):i-x):
print map(itemgetter(1),g)
在 Python 3 中转置,您将拥有:
from operator import itemgetter
from itertools import groupby
data = [2,lambda x:x[0]-x[1]):
print(list(map(itemgetter(1),g)))
修改包括将 lambda 函数改编为 Python 3。
请注意,我们还用 map
包装了 list()
函数,以便在地图对象之外获取列表对象。
就目前而言,通过此功能,我们可以获得您提供的代码所获得的效果。
输出:
[2,5]
[12,17]
现在,我们将修改此函数以获取元素的索引而不是列表中的值(此处命名为“数据”)。为此,我们只需将 0
作为参数传递给 itemgetter
而不是 1
:
data = [2,lambda x:x[0]-x[1]):
print(list(map(itemgetter(0),g)))
不,我们有索引。
输出:
[0,2,3]
[4,6,8,9]
第二部分只是使用索引来获取元组中的第一项(因此是您想要的索引)。
所以,简而言之,我改编了 consecutive_groups
中的原始函数 more_itertools
以返回项目的索引而不是它们的值,并使用这些索引检索每个项目中的第一个值元组。
使用 itertools
和 operator
模块进行处理:
from itertools import islice
from operator import itemgetter
import more_itertools as mit
it = iter(processed)
getter = itemgetter(0)
chip_nums = map(lambda x: int(x[1][-1]),processed)
for group in mit.consecutive_groups(chip_nums):
print([*islice(map(getter,it),len([*group]))])
输出:
[1,2]
[4,5]
[7,8]
[10,10]
[12,12]
[14]
[16,16]
[18,18]
[20,20]
[23]
[25]
[27,27]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。