Google's Python Class(五)——Python 字典和文件

原文:https://developers.google.com/edu/python/dict-files

哈希表 Dict

Python 中高效的键/值哈希表结构叫做字典(”dict”)。一个字典的内容可以写成一系列包含在大括号 {} 中的键:值对,例如,dict = {key1:value1, key2:value2, … }。“空字典”就是一对空的大括号 {}。

在字典中,使用方括号查找或者设置一个值,例如,dict[‘foo’] 查找键为 ‘foo’ 对应的值。字符串、数字和元组可以做键,任何类型都可以当做值。其它类型不一定能正确地用作键(字符串和元组可以正确地用作键是因为它们是不可变的)。查找一个不在字典中的值会报错——使用 “in” 来检查一个键是否在字典中,或者使用 dict.get(key),该方法返回对应的值或者如果键不存在,则返回 None(或者使用 get(key, not-found) 来返回那些键不存在与字典中的值)。

  ## Can build up a dict by starting with the the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print dict  ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print dict['a']     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print dict['z']                  ## Throws KeyError
  if 'z' in dict: print dict['z']     ## Avoid KeyError
  print dict.get('z')  ## None (instead of KeyError)

对于字典的 for 循环默认是遍历字典的键。键会按随机的顺序出现。dict.keys() 和 dict.values() 方法显式地返回由键或者值组成的列表。items() 返回一个由 (key, value) 元组组成的列表,这是最高效的检查字典中所有键值数据的方法。所有的这些列表都可以传进 sorted() 函数。

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict: print key
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys(): print key

  ## Get the .keys() list:
  print dict.keys()  ## ['a', 'o', 'g']

  ## Likewise, there's a .values() list of values
  print dict.values()  ## ['alpha', 'omega', 'gamma']

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print key, dict[key]

  ## .items() is the dict expressed as (key, value) tuples
  print dict.items()  ##  [('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')]

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print k, '>', v
  ## a > alpha    o > omega     g > gamma

上述这些方法有对应的 “iter” 变体 iterkeys()、itervalues() 和 iteritems(),这些方法避免了构建整个列表的开销——如果数据量很庞大,那么性能会有所提高。无论如何,我通常推荐用合乎实际的名字来使用普通的 keys() 和 values()。在 Python 3000 版本中,没必要使用 iterkeys() 这些变体。

注意:从性能的角度看,字典是一个很好的工具,你应该用尽可能简单的方法来使用它管理数据。例如,你可以需要读取一个每行以一个 ip 地址开头的日志文件,然后将 ip 地址保存到一个字典中用作键,而 ip 地址出现的行作为值。一旦你读取完整个文件,你可以查找任意 ip 地址并且马上查看他所在的行。字典将散乱的数据整理成有条理的东西。

格式化 Dict

% 运算符可以通过名字(键名)将字典中的值替代成字符串。

  hash = {}
  hash['word'] = 'garfield'
  hash['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % hash  # %d for int, %s for string
  # 'I want 42 copies of garfield'

Del

“del” 运算符表示删除。对于一些简单的情况,它可以删除一个变量的定义,仿佛该变量没有被定义过一样。Del 可以用于列表元素或者列表的片段来删除列表的一部分,也可以用于删除一个字典中的实体。

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print list      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print dict      ## {'a':1, 'c':3}

文件

open() 函数打开并且返回一个文件句柄,可以以通常的方式使用该句柄来读写文件。代码 f = open(‘name’, ‘r’) 打开一个文件并赋值给变量 f,准备好读取操作,完成的时候使用 f.close()。除了使用 ‘r’,也可以使用 ‘w’ 来写,’a’ 来追加。特殊模式 ‘rU’ 对于文本文件是“通用的”选项(”通用换行模式”),该模式可以把所有的换行符(’\r’ ‘\n’ ‘\r\n’)智能地转换为 ‘\n’(Windows 的换行是 ‘\r\n’,Unix 的是 ‘\n’,Mac 的是 ‘\r’)。标准的 for 循环适用于文本文件,遍历文件的行(这仅适用于文本文件,不适用于二进制文件)。for 循环是简单又高效的查看文本文件中所有行的方法:

  # Echo the contents of a file
  f = open('foo.txt', 'rU')
  for line in f:   ## iterates over the lines of the file
    print line,    ## trailing , so print does not add an end-of-line char
                   ## since 'line' already includes the end-of line.
  f.close()

每次读取一行这样做很好,因为这样并不需要一次将所有的文件内容放到内存中——如果你想要查看一个 10GB 文件的每一行,并不需要使用 10GB 的内存。f.readlines() 方法将整个文件读到内存并且返回一个以文件行为内容组成的列表。f.read() 方法读取整个文件并将内容放到一个字符串中,这样便于一次处理全部文本,例如我们后面会讨论到的正则表达式。

对于写操作,f.write(string) 方法是最简单的将数据写到已打开文件的方法。或者你可以对一个已打开的文件使用 “print”,不过这样做在语法上并不友好:”print >> f, string”。在 Python 3000,print 语法被改成普通的函数,并且该函数带有一个可选的参数 file=:”print(string, file=f)”。

Unicode 文件

“codecs” 模块提供读取 unicode 文件的支持。

import codecs

f = codecs.open('foo.txt', 'rU', 'utf-8')
for line in f:
  # here line is a *unicode* string

对于写操作,请使用 f.write(),因为 print 并没有完美支持 unicode。

练习:wordcount.py

结合所有的 Python 基础知识(字符串、列表、字典、元组、文件),尝试完成 google-python-exerciseswordcount.py 的问题(位于 basic/ 目录下)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值