Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:获取列表中指定元素后面的项_Python_List - Fatal编程技术网

Python:获取列表中指定元素后面的项

Python:获取列表中指定元素后面的项,python,list,Python,List,我有一个类似于['1','2','7','12','1','7']的字符串列表。给定一个我知道在列表中的字符串,有没有一种简单的方法可以返回该字符串后面所有元素的iterable,如果后面没有任何元素,则返回None 因此,输入'ONE'将返回['TWO','SEVEN',],输入'SEVEN'将返回['SEVEN',None] 我目前的做法是: follows = [] while test_string in string_list: index = string_list.inde

我有一个类似于['1','2','7','12','1','7']的字符串列表。给定一个我知道在列表中的字符串,有没有一种简单的方法可以返回该字符串后面所有元素的iterable,如果后面没有任何元素,则返回None

因此,输入'ONE'将返回['TWO','SEVEN',],输入'SEVEN'将返回['SEVEN',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 = []
>>> 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']

但这似乎过于繁琐。如果这是最好的办法,我可以接受。如果有更干净的方法,我很乐意学习。

比如:

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 = []
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]
>>> 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']

比如说:

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 = []
>>> 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']
也许是这个

from itertools import izip
[b for a, b in izip(string_list, string_list[1:] + [None]) if a == test_string]
也许是这个

from itertools import izip
[b for a, b in izip(string_list, string_list[1:] + [None]) if a == test_string]

嗯。。。感觉发电机在这里可能是件好事

>>> 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']

但是更干净?我想是口味的问题。

嗯。。。感觉发电机在这里可能是件好事

>>> 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']
但是更干净?我猜是口味的问题。

过程是:

查找元素的第一个索引。 在该元素之后获取所有内容。 把这些元素放在一起,因为你显然不想要重复的。 这看起来像:

set(the_list[the_list.index(the_element) + 1:])
(x[1] for x in zip(the_list, the_list[1:] + [None]) if x[0] == the_element)
现在我已经明白了你到底在问什么:

这个过程是:

获取相邻元素对,让最后一个元素与无元素配对。 从第一个元素匹配的每对中返回第二个元素的iterable。 这看起来像:

set(the_list[the_list.index(the_element) + 1:])
(x[1] for x in zip(the_list, the_list[1:] + [None]) if x[0] == the_element)
这个过程是:

查找元素的第一个索引。 在该元素之后获取所有内容。 把这些元素放在一起,因为你显然不想要重复的。 这看起来像:

set(the_list[the_list.index(the_element) + 1:])
(x[1] for x in zip(the_list, the_list[1:] + [None]) if x[0] == the_element)
现在我已经明白了你到底在问什么:

这个过程是:

获取相邻元素对,让最后一个元素与无元素配对。 从第一个元素匹配的每对中返回第二个元素的iterable。 这看起来像:

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


对于k==SEVEN,这将失败。对于k==SEVEN,这将失败。尽管您应该将其更新为一个iterable,并且在这样做时,您还可以使用xrange=这太完美了。我总是发现回过头来阅读python的列表理解比任何带条件的循环都要容易。当我找不到一种方法来写一篇文章的时候,我觉得这应该是可能的。谢谢。@dcurtis:我试着写一些答案,如果可能的话,可以在Python2.x和Python3.x中使用。Python3.x没有xrange。尽管您应该将其更新为一个iterable,并且在使用它时,您也可以使用xrange=这太完美了。我总是发现回过头来阅读python的列表理解比任何带条件的循环都要容易。当我找不到一种方法来写一篇文章的时候,我觉得这应该是可能的。谢谢。@dcurtis:我试着写一些答案,如果可能的话,可以在Python2.x和Python3.x中使用。Python3.x没有xrange。虽然它在test_string='SEVEN'中没有失败,但它不会在末尾添加任何内容。@Wilduck:也许你有一个旧版本的页面?旧版本没有添加None,但是从来没有一个版本因为test_string==SEVEN而失败。请注意,izip以最短的序列终止。我有一个旧版本。我指的是你提到红外线的答案在测试_string==7时会失败。无论如何,我投你一票。感谢您的回复。虽然test_string='SEVEN'没有失败,但它不会在末尾添加任何内容。@Wilduck:也许您有一个旧版本的页面?旧版本没有添加None,但是从来没有一个版本因为test_string==SEVEN而失败。请注意,izip以最短的序列终止。我有一个旧版本。我指的是你提到红外线的答案在测试_string==7时会失败。无论如何,我投你一票。谢谢你的回复。特殊情况还不够特殊。表示无元素的正确方法如下所示,当正常结果是以下元素的列表时,是一个无元素的列表,即【】。我查看了其他答案,意识到在花费大量精力试图理解您的问题后,关于你真正想要什么,我得出了与其他人完全不同的结论。以后请尽量说清楚一点/特殊情况还不够特殊。表示无元素的正确方法如下所示,当正常结果是以下元素的列表时,是一个无元素的列表,即【】。我查看了其他答案,意识到在花费大量精力试图理解您的问题后,关于你真正想要什么,我得出了与其他人完全不同的结论。以后请尽量说清楚一点/这它比上面的列表理解更具可读性,并且有可能比它们更好地引导。如果目标在列表中连续出现两次,那么它就失败了——例如,['1'、'1'、'2'、'7'、'12'、'1'、'7']应该返回['1'、'2'、'7'],而不是返回['1'、'7']
nds。该边缘情况未在规范中定义。我声明我的解决方案符合规范要求:这它比上面的列表理解更具可读性,并且有可能比它们更好地引导。如果目标在列表中连续出现两次,那么这就失败了——例如,['1'、'1'、'2'、'7'、'12'、'1'、'7']应该返回['1'、'2'、'7'],而不是返回['1'、'7']。该边缘情况未在规范中定义。我声明我的解决方案符合规范要求: