2016-09-18 5 views
0
l1 = [1,2,2,2] 

上記のリストでは、要素がl1 [0]で異なることがわかりました。 Pythonでその位置を見つける方法はありますか?アイテムが前のアイテムと異なるリスト内の位置を見つける方法はありますか?

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

EDIT:

+0

を明確にするために - リスト内のすべての項目は、1を除いて同じであり、あなたはその位置を見つけたいですか? – Mureinik

+0

@Mureinikはいplease –

+0

アイテムが変更されたすべての位置を検索したいと仮定すると、あなたの受け入れられた答えは '[1、2、2、1]'で動作しないか、[[1,2] 2,3,3]。 –

答えて

2

はこのお試しください

をラムダ式min(set(l1), key=l1.count)は、リスト内の回数の最も少ない数を発生する要素が何であるかを教えてくれる。次に、l1.indexを使用して、リスト内のその要素の位置を把握します。

+0

"TypeError: 'int'オブジェクトは反復可能ではありません" –

+0

@ user3543300解決方法ありがとうございます。あなたはそれを説明できますか? –

+0

ここで 'set(l1)'を評価する目的は何ですか? IMHO、あなたは 'set'部分をスキップして、まったく同じ出力を得ることができます。 –

0

この試し:あなたを仮定

l1 = [1,2,2,2] 

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

これはアイテムの変更については何も言いません。 2つの異なるアイテムだけを持つ長いリストは、多くの変化するポジションを持つことができます。あなたのコードに一致が見えません。 –

1
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,2,3,3,1,1]'で実行すると '[1,2,3]'が表示されますが、これは明らかに誤りです。 –

+0

正しいです。 UniqueListはリストl1から一意の要素を返します。したがって、UniqueListはarray([1,2,3])で、Indicesはarray([0,1,1,2,2,0,0])を返します。この場合、インデックスは一意の要素のインデックスを返します。 lの最初の要素は1であるため、インデックスでは0です(UniqueListのインデックスが0なので)。 4番目の要素は3、インデックスは2(ユニークリストの3のインデックスは2) –

0

のインデックスを表示する必要がありますすべてアイテムが変更される発生:

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] 

これは、リストの各項目を前の項目と単純に比較して、要素が異なる箇所をリストします。

0

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] 
関連する問題