我有一个类似于['ONE', 'TWO', 'SEVEN', 'TWELVE', 'ONE', 'SEVEN']
的字符串列表。给定一个我知道在列表中的字符串,是否有一种简单的方法可以返回该字符串后面的所有元素的可迭代(如果没有后面的话,则None
)?
因此,输入'ONE'
将返回['TWO', 'SEVEN']
,输入'SEVEN'
将返回['TWELVE', None]
。
我目前的做法是做类似的事情:
follows = []
while test_string in string_list:
index = string_list.index(test_string)
if index + 1 < len(string_list):
follows.append(string_list[index+1])
string_list = string_list[index+1:]
else:
follows.append(None)
string_list = []
但这似乎过于繁琐。如果这是最好的方式,我可以接受。如果有更清洁的方式,我很乐意学习它。
答案 0 :(得分:3)
如下:
>>> a = ['ONE', 'TWO', 'SEVEN', 'TWELVE', 'ONE', 'SEVEN']
>>> [a[x+1] if x+1 < len(a) else None for x in range(len(a)) if a[x] == 'ONE']
['TWO', 'SEVEN']
答案 1 :(得分:1)
l = ['ONE', 'TWO', 'SEVEN', 'TWELVE', 'ONE', 'SEVEN']
k = 'ONE'
[l[i+1] if i<len(l)-1 else None for i,e in enumerate(l) if e==k]
答案 2 :(得分:1)
也许这个?
from itertools import izip
[b for a, b in izip(string_list, string_list[1:] + [None]) if a == test_string]
答案 3 :(得分:1)
嗯......像发电机这样的感觉在这里可能是件好事。
>>> def follows(list, match):
... i = iter(list)
... x = next(i)
... while x:
... if x == match:
... try:
... yield next(i)
... except StopIteration:
... yield None
... x = next(i)
...
>>> [x for x in follows(['ONE', 'TWO', 'SEVEN', 'TWELVE', 'ONE', 'SEVEN'], 'SEVEN')]
['TWELVE', None]
>>> [x for x in follows(['ONE', 'TWO', 'SEVEN', 'TWELVE', 'ONE', 'SEVEN'], 'ONE')]
['TWO', 'SEVEN']
但清洁?我猜的味道很重要。
答案 4 :(得分:0)
过程是:
这看起来像:
set(the_list[the_list.index(the_element) + 1:])
现在我已经弄清楚你真正要问的是什么:
过程是:
None
配对。看起来像:
(x[1] for x in zip(the_list, the_list[1:] + [None]) if x[0] == the_element)