如果元组中的第二项是连续的,Python 从元组中提取索引

如何解决如果元组中的第二项是连续的,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 以返回项目的索引而不是它们的值,并使用这些索引检索每个项目中的第一个值元组。

,

使用 itertoolsoperator 模块进行处理:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?