質問

私はこのリストを持っています:

names = ['john','Jonh','james','James','Jardel']

私はリストの上にループし、同じ反復でケースの鈍感な一致で連続した名前を処理したいと思います。ですから、最初の反復では、「ジョン」と「ジョン」で何かをし、次の反復を「ジェームズ」から始めることを望んでいます。

ループ用のPython'sを使用してこれを行う方法は考えられません。

役に立ちましたか?

解決

これは1つです itertools.groupby, 、リストまたはその他の反復可能な要素を連続してグループ化します。比較する関数を指定することができます。そうすれば、あなたの場合、異なる場合の同じ名前を同じものとしてカウントできるようにします。

for k, g in itertools.groupby(names, lambda s: s.lower()):
    # Example: in the first iteration:
    #  k = "john"
    #  g = an iterator over ["john", "John"]
    # Process them as you like

他のヒント

names = ['john','John','james','James']
for name, capitalized_name in zip(names[::2], names[1::2]):
    print name, capitalized_name

これが適切に機能するためには、均等なアイテムが必要であることに注意してください。

または(多分より良い;小さな文脈で伝えるのは難しい) set リストをフィルタリングするには、一意の名前のみを含む(これが注文を失うことに注意してください):

>>> names = ['john','John','james','James','Jardel']
>>> unique_names = set([x.lower() for x in names])
>>> for unique_name in unique_names:
...     print unique_name
... 
jardel
james
john

あなたはただ使用することができます while ループ:

i = 0
while i < len(names):
  # compare names[i] with names[i + 1]
  i = i + 2 # or + 1 if names not equal, for example

それとも、もう少し関与するものをお探しですか?

ループを繰り返すと、リスト内の前の名前を追跡することができます。同時に、名前を保存するとき、lower()またはcapitainize()に電話をかけて、各名前のフォーマットを一貫させることができます。

例えば

first = True
prev= ""
for name in names:
    if first:                         #First iteration
        prev = name.lower()           #Need to get the first elem
        do_something_to(curr)
        first = False
    else:
        if prev == name.lower():
             print "do nothing"
        else:
             do_something_to(curr)
        prev = name.lower()

最も効率的ではないかもしれませんが、機能します。

私の$ 0.02:

def byPairs(li):
    for i in xrange(1, len(li), 2):
        yield (li[i-1], li[i])

for a,b in byPairs(names):
    if a.lower()==b.lower():
        doSomething(a,b)

質問を正確に理解していたかどうかはわかりません。何を達成しようとしていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top