返回列表中的元素及其在该列表中的位置

时间:2015-03-25 02:49:34

标签: python list loops python-3.x indexing

我有一个列表,我想返回该列表中的每个元素及其在中的位置。

例如:

my_enumerate(['dog', 'pig', 'cow']) 

应该返回:

[(0, 'dog'), (1, 'pig'), (2, 'cow')]

以下是我如何处理它:

def my_enumerate(items):
''' returning position of item in a list'''
lista = []
for num in range(0, len(items)+1):
    for item in items:
        lista.append("({0}, {1})".format(num, item))
return lista

归还给我:

['(0, dog)', '(0, pig)', '(0, cow)', '(1, dog)', '(1, pig)', '(1, cow)', '(2, dog)', '(2, pig)', '(2, cow)', '(3, dog)', '(3, pig)', '(3, cow)']

该函数的行为应与内置的枚举函数完全相同,但我不允许使用它。

4 个答案:

答案 0 :(得分:4)

您的程序会生成列表中所有索引和元素的笛卡尔积。它接受每个索引并生成包含列表中元素的所有字符串。另外,请注意,您应该只迭代到列表的长度,当您执行len(items) + 1时,实际上超过了列表的实际长度。

您只能使用第一个循环,例如

>>> def my_enumerate(items):
...     lista = []
...     for num in range(len(items)):
...         lista.append("({0}, {1})".format(num, items[num]))
...     return lista
... 
>>> my_enumerate(['dog', 'pig', 'cow']) 
['(0, dog)', '(1, pig)', '(2, cow)']

你也可以使用简单的list comprehension,就像这样

>>> def my_enumerate(items):
...     return ["({0}, {1})".format(num, items[num]) for num in range(len(items))]
... 
>>> my_enumerate(['dog', 'pig', 'cow']) 
['(0, dog)', '(1, pig)', '(2, cow)']

注1:在Python 3.x中,除非必要,否则不必使用格式字符串中的位置。所以,"({}, {})".format就足够了。

注2:如果您确实想要返回元组,例如enumerate,那么您不应该使用字符串格式,而是准备这样的元组

>>> def my_enumerate(items):
...     return [(num, items[num]) for num in range(len(items))]
... 
>>> my_enumerate(['dog', 'pig', 'cow']) 
[(0, 'dog'), (1, 'pig'), (2, 'cow')]

注意3:如果您真的想模拟enumerate,就像在Python 3.x中一样,那么您应该更好地使用生成器函数,就像这样

>>> def my_enumerate(items):
...     for num in range(len(items)):
...         yield (num, items[num])
...     
... 
>>> my_enumerate(['dog', 'pig', 'cow']) 
<generator object my_enumerate at 0x7f5ff7abf900>
>>> list(my_enumerate(['dog', 'pig', 'cow']))
[(0, 'dog'), (1, 'pig'), (2, 'cow')]

注4:更多好消息是,您可以使用yield fromgenerator expression编写相同的my_enumerate,就像这样

>>> def my_enumerate(items):
...     yield from ((num, items[num]) for num in range(len(items)))
... 
>>> my_enumerate(['dog', 'pig', 'cow']) 
<generator object my_enumerate at 0x7f5ff7abfe10>
>>> list(my_enumerate(['dog', 'pig', 'cow']))
[(0, 'dog'), (1, 'pig'), (2, 'cow')]

答案 1 :(得分:2)

您可以使用ziprangelen轻松地在单行中完成此操作:

def my_enumerate(items):
    return zip(range(len(myList)), myList)

my_list = ['dog', 'pig', 'cow']
print(my_enumerate(my_list)) # prints [(0, 'dog'), (1, 'pig'), (2, 'cow')]

以上是Python 2版本。请注意,在Python 3中,zip返回一个生成器,实际上可能正是您所需要的,但如果您绝对需要一个列表,则可以将返回的表达式包装在list()调用中。

答案 2 :(得分:2)

如果你把它写成一个生成器,它甚至可以使用无限生成器:

def my_enumerate(items):
    i = 0
    for e in items:
        yield (i, e)
        i += 1

print(list(my_enumerate(['dog', 'pig', 'cow']))

答案 3 :(得分:1)

最简单的:

def my_enumerate(items):
    return list(enumerate(items))