Python:查找列表对中一个成员的连续变化,报告另一个成员
一定有更简单、更符合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
谢谢
Tim7 个回答
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)
我添加了一个更易读的生成器版本。