私はこのリストを持っています:
names = ['john','Jonh','james','James','Jardel']
リストをループして、同じ繰り返しで大文字と小文字を区別しない一致で連続した名前を処理したい。したがって、最初の反復では、'john' と 'John' を使用して何かを行い、次の反復を 'james' から開始したいと考えています。
Python の for ループを使用してこれを行う方法が思いつきません。何か提案はありますか?
私はこのリストを持っています:
names = ['john','Jonh','james','James','Jardel']
リストをループして、同じ繰り返しで大文字と小文字を区別しない一致で連続した名前を処理したい。したがって、最初の反復では、'john' と 'John' を使用して何かを行い、次の反復を 'james' から開始したいと考えています。
Python の for ループを使用してこれを行う方法が思いつきません。何か提案はありますか?
これはitertools.groupby
、リストまたは他の iterable から連続する等しい要素をグループ化するためのものです。比較を行う関数を指定できるため、ケースが異なる同じ名前でも同じものとしてカウントできます。
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
これが適切に機能するには、均等な量のアイテムが必要であることに注意してください。
または (おそらく、コンテキストが少ないとわかりにくい) a を使用して、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
それとも、もう少し複雑なものを探していますか?
私の $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)
質問を正確に理解したかどうかはわかりません。あなたは何を達成しようとしていますか?
ループを反復処理するときに、リスト内の以前の名前を追跡してみることができます。同時に、名前を保存する場合は、lower() または capitalize() を呼び出して、各名前のフォーマットを統一し、比較しやすくすることができます。
例えば
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()
最も効率的ではないかもしれませんが、機能します。