如何找到项目与上一项不同的列表中的位置?
试试这个:
l1.index(min(set(l1), key=l1.count))
编辑:
Lambda表达式min(set(l1), key=l1.count)
告诉我们什么是发生在列表中的最少次数的元素。然后我们使用l1.index
来找出该元素在列表中的位置。
得到一个错误“TypeError:'int'object is not iterable” –
@ user3543300感谢您的解决方案。你能解释吗? –
这里评估'set(l1)'的目的是什么?恕我直言,你可以跳过'set'部分,仍然得到完全相同的输出。 –
尝试这种情况:
l1 = [1,2,2,2]
for pos, i in enumerate(l1):
if l1.count(i)==1:
print pos
这没有提及更改项目。只有两个不同项目的长列表可以有很多不同的位置。在你的代码中不会显示匹配。 –
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])
在'l = [1,2,3,3,1,1]'上显示'[1,2,3]',这显然是不正确的。 –
这是正确的。 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]
澄清 - 在列表中的所有项目,除了一个是相同的,你想找到它的位置? – Mureinik
@Mureinik是的,请 –
假设你想查找*所有*项目改变的位置,你接受的答案在'[1,2,2,1]'上不起作用,或者甚至在'[1,2, 2,3,3]'。 –