Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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_Element_Intersection - Fatal编程技术网

Python 查找列表元素的最近值

Python 查找列表元素的最近值,python,list,element,intersection,Python,List,Element,Intersection,我有两份清单: >>> list1 = ['gain','archive','win','success'] >>> list2 = ['i','win','game','i','am','success','cool'] 通过比较两个列表,我发现两个列表的值相同 >>> result= set(list1) & set(list2) 输出为 set(['win', 'success']) 现在我想找到结果的下一个元素值。这里应

我有两份清单:

>>> list1 = ['gain','archive','win','success']
>>> list2 = ['i','win','game','i','am','success','cool']
通过比较两个列表,我发现两个列表的值相同

>>> result= set(list1) & set(list2)
输出为

set(['win', 'success'])
现在我想找到
结果的下一个元素值。这里应该是:
“游戏”
“酷”


(使用Python2.7)我如何做到这一点呢?

因为您有交叉词

result = { 'win', 'success' }
您可以在
list2
中找到如下单词:

next_words = [list2[list2.index(word)+1] for word in result]
获取列表中给定元素的索引。可以向其中添加1以获取下一个元素


如果您的元素位于列表的末尾,它将抛出异常,因为没有要获取的“下一个”元素。

您可以使用
index
函数并添加1。但是要小心,如果您的公共元素是列表中的最后一个元素,那么它将生成一个错误

list1 = ['gain','archive','win','success']
list2 = ['i','win','game','i','am','success','cool']
result= set(list1) & set(list2)

list3 = [list2[list2.index(e)+1] for e in result]
编辑对于最后一个元素是公共元素的情况:

result= set(list1) & set(list2)
list4 = []
for e in result:
    try:
        list4.append(list2[list2.index(e)+1])
    except:
        pass

输出:
['game','cool']
您可以使用
list2.index
,但这只是为了找到索引而进行的完全搜索,并且人为地将复杂性从
O(n)
增加到
O(n*n)

只需记录每个单词的索引即可。有几种方法可以做到这一点

  • 创建您自己的搜索常用词的函数,并将它们作为
    list2
    中这些词的索引返回。这可能是最不刺激但最快的

  • list2
    的单词到它们的索引创建一个字典,然后在计算集合交集后,在dict上查找索引并增加1。您需要构建一个清单2大小的完整字典,这可能会很昂贵(但仍然比
    O(n*n)
    好)

  • list2
    中的单词到下一个单词或
    None
    中的单词(如果没有)创建一个字典,并在dict上查找索引。您需要构建一个清单2大小的完整字典,这可能会很昂贵

  • 如果您知道如何使用
    itertools
    ,则可以在
    list2
    上执行迭代器,生成索引和单词,如果单词位于
    list1
    中,则过滤结果,然后仅选取索引


    • 这为列表2中的下一个元素提供了技巧:

      next_result = [list2[list2.index(el)+1] for el in result if list2.index(el)+1<len(list2)]
      

      next_result=[list2[list2.index(el)+1]如果list2.index(el)+1您可以在
      list2
      上进行成对迭代,并手动进行“交叉”:

      list1 = ['gain','archive','win','success']
      list2 = ['i','win','game','i','am','success','cool']
      
      set1 = set(list1)
      
      result = []
      for item, nextitem in zip(list2, list2[1:]):  # pairwise iteration
          if item in set1:
              result.append(nextitem)   # append the next item if the current item is in the intersection
      
      print(result)  # ['game', 'cool']
      

      很好,当没有“下一个”元素时,如何避免抛出异常。这取决于在这种情况下希望发生什么。您没有指定。