繁体   English   中英

pythonic打印值的方式

[英]The pythonic way of printing a value

这可能衡量你是如何pythonic。 我正在玩试图学习python所以我不能接近pythonic足够。 infile是一个虚拟的patriline,我想要一份父亲的儿子名单。

INFILE:

haffi jolli dkkdk lkskkk lkslll sdkjl kljdsfl klsdlj sdklja asldjkl

码:

def main():
    infile = open('C:\Users\Notandi\Desktop\patriline.txt', 'r')
    line = infile.readline()               
    tmpstr = line.split('\t')
    for i in tmpstr[::2]:
        print i, '\t', i + 1
    infile.close()
main()

问题是i + 1 ; 我想在每一行打印出两个字符串。 这个清楚吗?

你在分裂字符串中的单词和它们的索引之间感到困惑。 例如,第一个单词是“haffi”,但第一个单词是0。

要迭代索引及其对应的单词,请使用enumerate:

for i, word in enumerate(tmpstr):
    print word, tmpstr[i+1]

当然,这看起来很乱。 更好的方法是迭代字符串对。 有很多方法可以做到这一点; 这是一个。

def pairs(it):
    it = iter(it)
    for element in it:
        yield element, next(it)

for word1, word2 in pairs(tmpstr):
    print word1, word2

我在这里使用with语句,如果您使用的是旧版本的python,则需要导入:

from __future__ import with_statement

对于实际的代码,如果你能负担得起将整个文件加载到内存中两次(即,它非常小)我会这样做:

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as f:
        strings = f.read().split('\t')
    for father, son in zip(string, string[1:]):
        print "%s \t %s" % (father, son)
main()

这样你跳过最后一行就没有太多的开销而不包括最后的无子叶,这就是你想要的(?)

作为一个切线:如果文件非常大,你可能不想将整个内容加载到内存中,在这种情况下你可能需要一个生成器。 如果您实际打印出所有内容,则可能不需要执行此操作,但如果这是问题的简化版本,那么我将如何使生成器分割文件:

class reader_and_split():
    def __init__(self, fname, delim='\t'):
        self.fname = fname
        self.delim = delim
    def __enter__(self):
        self.file = open(self.fname, 'r')
        return self.word_generator()
    def __exit__(self, type, value, traceback):
        self.file.close()
    def word_generator(self):
        current = []
        while True:
            char = self.file.read(1)
            if char == self.delim:
                yield ''.join(current)
                current = []
            elif not char:
                break
            else:
                current.append(char)

生成器的值是,在运行拆分之前,不要将文件的全部内容加载到内存中,这对于非常非常大的文件来说可能很昂贵。 为简单起见,此实现仅允许单个字符分隔符。 这意味着解析所有内容所需要做的就是使用生成器,快速脏的方法是:

with reader_and_split(fileloc) as f:
    previous = f.next()
    for word in f:
        print "%s \t %s" % (previous, word)
        previous = word

在文件阅读和打印方面,您可以更加pythonic。 尝试这个:

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as f:
        strings = f.readline().split('\t')
    for i, word in enumerate(strings):
        print "{} \t {}".format(word, strings[i+1:i+2])
main()

使用strings[i+1:i+2]可确保在尝试到达列表末尾的第i+1个索引时不抛出IndexError (而是返回[] )。

这是一个干净的方法。 它具有在输入奇数项目时不会崩溃的好处,但当然您可能更喜欢这种情况下的例外。

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as infile:
        line = infile.readline()
        previous = None
        for i in line.split('\t'):
            if previous is None:
                previous = i
            else:
                print previous, '\t', i
                previous = None

我不会声称这是pythonic。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM