Python:查找列表对中一个成员的连续变化,报告另一个成员

1 投票
7 回答
564 浏览
提问于 2025-04-16 03:29

一定有更简单、更符合Python风格的方法来做到这一点。

给定这个成对的列表:

pp = [('a',1),('b',1),('c',1),('d',2),('e',2)]

我怎么才能最简单地找到相邻成对中第二个元素变化时的第一个元素(在这里是从1变成2)。所以我在找的是['c','d']。假设整个列表中pair[1]只会有一次变化,但它可能是一个字符串。

这段代码可以工作,但看起来实在是太长太麻烦了。

for i, pair in enumerate(pp):
    if i == 0: 
        pInitial = pair[0] 
        sgInitial = pair[1]
    pNext = pair[0]
    sgNext = pair[1]
    if sgInitial == sgNext:
        sgInitial = sgNext
        pInitial = pNext
    else:
        pOne = pInitial
        pTwo = pNext
        x = [pOne, pTwo]
        print x
        break

谢谢

Tim

7 个回答

0

试着把 pp[:-1]pp[1:] 进行比较,像这样:

[a for a in zip(pp[:-1], pp[1:]) if a[0][1] != a[1][1]]

(先看看 zip(pp[:-1], pp[1:]),了解一下发生了什么)

补充:

我想你可能需要:

([a[0][0], a[1][0]] for a in zip(pp[:-1], pp[1:]) if a[0][1] != a[1][1]).next()
0

你可以试试这样的做法:

[[pp[i][0],pp[i+1][0]] for i in xrange(len(pp)-1) if pp[i][1]!=pp[i+1][1]][0]

(使用列表推导式)

2
import itertools as it

pp = [('a',1),('b',1),('c',1),('d',2),('e',2)]

# with normal zip and slicing
for a,b in zip(pp,pp[1:]):
    if a[1] != b[1]:
        x=(a[0],b[0])
        print x
        break
# with generators and izip
iterfirst = (b for a,b in pp)
itersecond = (b for a,b in pp[1:])
iterfirstsymbol = (a for a,b in pp)
itersecondsymbol = (a for a,b in pp[1:])
iteranswer = it.izip(iterfirstsymbol, itersecondsymbol, iterfirst, itersecond)

print next((symbol1, symbol2)
           for symbol1,symbol2, first, second in iteranswer
           if first != second)

我添加了一个更易读的生成器版本。

撰写回答