Python:获取遵循列表的指定元素的项目

时间:2011-01-05 23:04:05

标签: python list

我有一个类似于['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 = []

但这似乎过于繁琐。如果这是最好的方式,我可以接受。如果有更清洁的方式,我很乐意学习它。

5 个答案:

答案 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)

过程是:

  1. 找到元素的第一个索引。
  2. 获取该元素之后的所有内容。
  3. 从这些元素中创建一个集合,因为您显然不需要重复。
  4. 这看起来像:

    set(the_list[the_list.index(the_element) + 1:])
    

    现在我已经弄清楚你真正要问的是什么:

    过程是:

    1. 获取相邻元素对,让最后一个元素与None配对。
    2. 从第一个元素匹配的每一对中返回第二个元素的可迭代。
    3. 看起来像:

      (x[1] for x in zip(the_list, the_list[1:] + [None]) if x[0] == the_element)