如何找到项目与上一项不同的列表中的位置?

问题描述:

l1 = [1,2,2,2] 

在上面的列表中,我知道元素在l1 [0]中有所不同。有什么方法可以在python中找到位置吗?如何找到项目与上一项不同的列表中的位置?

+0

澄清 - 在列表中的所有项目,除了一个是相同的,你想找到它的位置? – Mureinik

+0

@Mureinik是的,请 –

+0

假设你想查找*所有*项目改变的位置,你接受的答案在'[1,2,2,1]'上不起作用,或者甚至在'[1,2, 2,3,3]'。 –

试试这个:

l1.index(min(set(l1), key=l1.count)) 

编辑:

Lambda表达式min(set(l1), key=l1.count)告诉我们什么是发生在列表中的最少次数的元素。然后我们使用l1.index来找出该元素在列表中的位置。

+0

得到一个错误“TypeError:'int'object is not iterable” –

+0

@ user3543300感谢您的解决方案。你能解释吗? –

+0

这里评估'set(l1)'的目的是什么?恕我直言,你可以跳过'set'部分,仍然得到完全相同的输出。 –

尝试这种情况:

l1 = [1,2,2,2] 

for pos, i in enumerate(l1): 
    if l1.count(i)==1:  
     print pos 
+0

这没有提及更改项目。只有两个不同项目的长列表可以有很多不同的位置。在你的代码中不会显示匹配。 –

import numpy as np 
UniqueList, indices = np.unique(l1, return_inverse=True) 
print(UniqueList) #Unique elements in List l1 

阵列([1,2])

print(indices) #indices of element in l1 mapped to UniqueList 

阵列([0,1,1,1])

+0

在'l = [1,2,3,3,1,1]'上显示'[1,2,3]',这显然是不正确的。 –

+0

这是正确的。 UniqueList返回列表l1中的唯一元素。因此,UniqueList是数组([1,2,3]),索引将返回 - >数组([0,1,1,2,2,0,0])。在这种情况下,索引返回唯一元素的索引。因为l中的第一个元素是1,所以In索引中它是0(因为UniqueList中的索引1为0)。第四个元素是3,在索引中它将是2(UniqueList中的索引3是2) –

假设你需要显示指标全部发生项目更改的情况:

l = [1 ,2, 2, 3, 3, 1, 1] 

changes = [i for i, n in list(enumerate(l))[1:] if l[i] != l[i-1]] 

print(changes) 
> [1, 3, 5] 

这只是比较列表中的每个项目和前一个项目,列出元素不同的地方。

使用itertools配方unique_everseen的修改,用于跟踪列表中新条目的解决方案。

from itertools import ifilterfalse 
def unique_everseen(iterable, key=None, per_index=False): 
    "List unique elements, preserving order. Remember all elements ever seen. 
    Use per_index=True to return indices instead of elements." 
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D 
    # unique_everseen('ABBCcAD', str.lower) --> A B C D 
    # unique_everseen('ABBCcAD', str.lower, True) --> 0 1 3 6 
    seen = set() 
    seen_add = seen.add 
    if key is None: 
     for index, element in enumerate(ifilterfalse(seen.__contains__, iterable)): 
      seen_add(element) 
      yield element if not per_index else index 
    else: 
     for index, element in enumerate(iterable): 
      k = key(element) 
      if k not in seen: 
       seen_add(k) 
       yield element if not per_index else index 

要尝试一下在你的例子:

list(unique_everseen(l1, per_index=True)) # returns [0, 1]