美文网首页
Python3 - 序列上索引值迭代

Python3 - 序列上索引值迭代

作者: 惑也 | 来源:发表于2018-12-22 11:35 被阅读30次

问题

迭代一个序列的同时跟踪正在被处理的元素索引。

解决方案

内置的 enumerate() 函数可以很好的解决这个问题:

my_list = ['a', 'b', 'c']

for key, value in enumerate(my_list):
    print(key, value)

0 a
1 b
2 c

为了按传统行号从1开始输出,你可以传递一个开始参数:

for key, value in enumerate(my_list, 1):
    print(key, value)

1 a
2 b
3 c

enumerate()函数对于跟踪某些值在列表中出现的位置是很有用的。比如,想将一个文件中出现的单词映射到它出现的行号上去:

word_summary = defaultdict(list)

with open('/Users/xz/test/Bath.txt', 'r+') as f:
    lines = f.readlines()
    for idx, value in enumerate(lines, 1):
        words = [w.strip(",.").lower() for w in value.split()]
        for word in words:
            word_summary[word].append(idx)

print(word_summary)

defaultdict(<class 'list'>, {'i': [1, 1, 1, 1, 2, 3], 'will': [1], 'not': [1, 3], 'take': [1, 3], 'a': [1, 2, 2, 2, 2, 3], 'bath': [1, 1, 3], 'won’t': [1], 'get': [1], 'in': [1], 'tub': [1, 3], 'has': [1], 'last': [1], 'week': [1], 'don’t': [1], 'need': [1, 2], 'another': [1], 'scrub': [1], 'would': [2], 'my': [2, 2], 'rubber': [2, 2], 'duck': [2], 'bucket': [2], 'and': [2], 'boat': [2], 'toy': [2, 3], 'whale': [2], 'submarine': [2], 'ball': [2], 'now': [3], 'can': [3], 'the': [3], 'is': [3], 'too': [3], 'small': [3], 'it’s': [3], 'all': [3], 'filled': [3], 'up': [3], 'with': [3], 'there’s': [3], 'no': [3], 'room': [3], 'for': [3], 'me': [3]})

打印结果 word_summary ,它是一个defaultdict字典,每个单词有一个 key ,每个 key 对应的值是一个由这个单词出现的行号组成的列表。 如果某个单词在一行中出现过两次,那么这个行号也会出现两次, 同时也可以作为文本的一个简单统计。

讨论

当需要额外定义一个计数变量的时候,使用 enumerate() 函数会更加简单。比如:

lineno = 1
for line in f:
    # Process line
    ...
    lineno += 1

使用 enumerate() 函数来代替就显得更加优雅了:

for lineno, line in enumerate(f):
    # Process line
    ...

enumerate() 函数返回的是一个 enumerate 对象实例, 它是一个迭代器,返回连续的包含一个计数和一个值的元组, 元组中的值通过在传入序列上调用 next()函数返回。

需要注意的是,当在一个已经解压后的元组序列上使用 enumerate() 函数时很容易调入陷阱。示例:

data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]

# Correct!
for n, (x, y) in enumerate(data):
    ...
# Error!
for n, x, y in enumerate(data):
    ...

相关文章

  • Python3 - 序列上索引值迭代

    问题 迭代一个序列的同时跟踪正在被处理的元素索引。 解决方案 内置的 enumerate() 函数可以很好的解决这...

  • 数据库:索引注意事项

    使用like关键字时,前置%会导致索引失效。 使用null值会被自动从索引中排除,索引一般不会建立在有空值的列上。...

  • SQL不走索引的可能原因

    1、联合索引,查询条件没有联合索引的第一列。 2、在包含有null值的table列上建立索引,当时使用select...

  • sql优化总结

    1.在where和order by 涉及的列上建立索引2.where中对null(空值)判断,否则导致引擎放弃索引...

  • mysql 重复索引、冗余索引和索引碎片修复

    重复索引和冗余索引 重复索引:在同一个列建立的多个单值索引,或者在顺序相同的多个列上建立了多个复合索引。这种重复索...

  • enumerate带索引遍历

    将一个可迭代/遍历的对象组成一个索引序列,利用他可以同时获得索引与值 可以指定索引起始值

  • 迭代

    只能迭代可迭代对象,支持 break continue 遍历属性,包括原型 数组的属性为其索引值 结论

  • jmespath 基本用法

    一. 基本语法 1.字典层级:(通过键取相应值) 2.列表索引(通过索引取相应值,索引从0开始,负数表示倒序,-...

  • Doris系列15- 索引

    一. 索引概述 目前Doris只支持bitmap 索引BITMAP 索引仅在单列上创建 bitmap index:...

  • Python3 - 不同序列上元素的迭代

    问题 在多个对象上执行相同的操作,但是这些对象在不同的容器中,希望代码在不失可读性的情况下,避免写重复的循环。 解...

网友评论

      本文标题:Python3 - 序列上索引值迭代

      本文链接:https://www.haomeiwen.com/subject/faqikqtx.html