Frage

Ich habe diese Liste:

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

Ich möchte Schleife über die Liste und behandel aufeinander folgende Namen mit Groß- und Kleinschreibung Übereinstimmung in der gleichen Iteration. So in der ersten Iteration würde ich etwas with'john tun‘und‚John‘und ich möchte, dass die nächste Iteration beginnen‚james‘.

Ich kann nicht einen Weg finden, dies mit Python for-Schleife zu tun, irgendwelche Vorschläge?

War es hilfreich?

Lösung

Dies wäre ein für itertools.groupby, wobei die Gruppen aufeinanderfolgenden gleiche Elemente aus einer Liste oder eine anderen iterable. Sie können eine Funktion angeben, um den Vergleich zu tun, so dass die gleichen Namen in verschiedenen Fällen in Ihrem Fall, können immer noch als die gleiche Sache gezählt werden.

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

Andere Tipps

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

Beachten Sie, dass Sie eine gerade Anzahl von Elementen für diese Arbeit richtig benötigen.

oder (vielleicht besser, hart mit wenig Kontext zu sagen) verwenden, um ein set die Liste zu filtern, dass nur eindeutige Namen enthalten (beachten Sie, dass dieser Auftrag verliert):

>>> 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

Sie können nur eine while Schleife verwenden:

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

Oder suchen Sie etwas ein bisschen mehr beteiligt?

Wie Sie Iterierte durch die Schleife, Sie versuchen, den Überblick über die bisherigen Namen in der Liste halten können. Zur gleichen Zeit, wenn Sie die Namen speichern gehen, können Sie einen Anruf tätigen zu senken () oder nutzen Sie () die Formatierung der einzelnen Namen zu machen konsistent, damit Sie sie leichter vergleichen können.

z.

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()

Mai nicht die effizienteste, aber funktioniert.

My $ 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)

Ich bin mir nicht sicher, ob ich die Frage genau verstanden; was wollen Sie erreichen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top