开发者

Python iterator question

I have this list:

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

I want loop over the list and handle consecutive names with a case insensitive match in the开发者_高级运维 same iteration. So in the first iteration I would do something with'john' and 'John' and I want the next iteration to start at 'james'.

I can't think of a way to do this using Python's for loop, any suggestions?


This would be one for itertools.groupby, which groups consecutive equal elements from a list or other iterable. you can specify a function to do the comparison, so that, in your case, the same name in different cases can still be counted as the same thing.

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

Note that you need an even amount of items for this to work properly.

Or (maybe better; hard to tell with little context) use a set to filter the list to contain only unique names (note that this loses order):

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


You could just use a while loop:

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

Or are you looking for something a bit more involved?


As you iterate thru the loop, you could try keeping track of the previous name in the list. At the same time, when you're going to store the names, you can make a call to lower() or capitalize() to make the formatting of each name consistent so that you can compare them easier.

e.g.

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

May not be the most efficient, but works.


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)

I'm not sure I understood the question exactly; what are you trying to accomplish?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜