原文作者:Alex Martelli 中文编译:Tony (digitalsatori) 问题 如何访问一个字符串的其中一部分。比如,读入一个固定长度的记录,如何才能提取出记录中各字段的值? 解决方法 字符串'切片'的方法不错,但是每次只能提取一个字段: afield = theline[3:8] 如果还要考虑每个字段的长度,那 struct.unpack 再合适不过了。比如: import struct # 获取5个字节长度的字符串,跳过3个字节,获取2个长度为8个字节的字符串,获取剩余的全部字符 baseformat = "5s 3x 8s 8s" # 从baseformat中可以知道字符串theline的最短的长度(本例中为24,我们可以使用 # struct.calcsize 计算来获得) numremain = len(theline) - struct.calcsize(baseformat) # 创建带's'的格式化子串,然后使用unpack format = "%s %ds" % (baseformat, numremain) l, s1, s2, t = struct.unpack(format, theline) 如果你想要跳过(而不是如上获取)剩余的字符,你可以: l, s1, s2 = [...]
Displaying posts tagged with
“list comprehension”
Python食谱-1.1.依次处理字符串中的每个字符
By digitalsatori on 十二月 30th, 2008
原文作者:Luther Blissett 中文翻译:Tony Gu (digitalsatori) 问题 如何才能根据需要依次处理字符串中的每个字符? 解决办法 我们可以创建一个以字符串中每个字符为成员的列表。(Python中并没有所谓”字符“的类型,这里的字符是指长度为1的字符串)。调用Python内置函数 list ,将字符串作为其参数: thelist = list(thestring) 其实象这样的列表也不需要创建,因为我们可以用for语句直接遍历字符串: for c in thestring: do_something_with(c) 或者使用列表推导(list comprehension): results = [do_something_with(c) for c in thestring] 也可以使用Python内置函数 map 调用其它的函数,使其操作于字符串的每个字符上,其效果与列表推导完全一样: results = map(do_something, thestring) 讨论 在Python中,字符就是长度为1的字符串。我们可以通过循环遍历一个字符串来访问其所包含的每个字符。如果你想调用一个函数来操作字符串上的每一个字符,那么可以使用 map 来处理。对一个字符串调用内置函数 list 可以获得该字符串的子串列表,该列表的每个成员字串的长度为1(也就是字符串的每个字符)。如果你想获得字符串上所有字符的集合(Set),可以调用sets.(译者注: 集合与上述列表的一个差别:一个集合内没有相同的成员项,列表则不然) import sets magic_chars = sets.Set('abracadabra') poppins_chars = sets.Set('supercalifragilisticexpialidocious') print ''.join(magic_chars & poppins_chars) [...]













