【问题标题】:Print two presorted lists into one output file in python在python中将两个预先排序的列表打印到一个输出文件中
【发布时间】:2012-07-10 17:19:47
【问题描述】:

我有两个列表已经按需要排序,我需要将它们放入一个文件中,例如这个例子:

list1 = [a, b, c, d, e]
list2 = [1, 2, 3, 4, 5]

输出文件应如下所示:

a1
b2
c3
d4
e5

我对 python 相当陌生,所以我不太确定如何进行文件写入。我阅读使用with open(file, 'w') as f: 是一种更好/更简单的方式来启动写入块,但我不确定如何合并列表并打印它们。我可能可以将它们合并到第三个列表中,然后使用print>>f, item 将其打印到文件中,但我想看看是否有更简单的方法。

谢谢!

后期编辑:查看我的列表,它们的长度并不总是相同,但无论如何都需要打印所有数据。因此,如果 list2 变为 7,那么输出将需要是:

a1
b2
c3
d4
e5
6
7

反之亦然,其中 list1 可能比 list2 长。

【问题讨论】:

    标签: python list file-io merge


    【解决方案1】:

    使用zip() 函数来组合(即压缩)您的两个列表。例如,

    list1 = ['a', 'b', 'c', 'd', 'e']
    list2 = [1, 2, 3, 4, 5]
    
    zip(list1, list2)
    

    给予:

    [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
    

    然后您可以格式化输出以满足您的需要。

    for i,j in zip(list1, list2):
        print '%s%d' %(i,j)
    

    屈服:

    a1
    b2
    c3
    d4
    e5
    

    更新

    如果您的列表长度不等,则此方法使用 itertools.izip_longest() 可能对你有用:

    import itertools
    list1 = ['a', 'b', 'c', 'd', 'e']
    list2 = [1, 2, 3]
    
    for i,j in itertools.izip_longest(list1, list2): 
        if i: sys.stdout.write('%s' %i)
        if j: sys.stdout.write('%d' %j)
        sys.stdout.write('\n')
    

    给予:

    a1
    b2
    c3
    d
    e 
    

    注意,如果您使用的是 Python 3,则有一个很好的方法可以使用 print() 函数。我在这里使用write() 以避免项目之间出现额外的空格。

    【讨论】:

    • 太棒了,这似乎有效。我将%d%d 更改为%s%s,因为在我的程序中它的技术字符串(抱歉从未指定)。有没有办法修改这个,如果一个列表比另一个列表长,它仍然会打印出所有值(即使它们没有匹配)?
    • hm 我假设此链接中的 map 语句将在您的 for 循环之前进行?
    • hm 这行得通,但会给出一些看起来很疯狂的输出。这是正确的,但每一行都在括号中,并且每个项目都有单引号。这是使用 itertools 的“功能”还是我可以以某种方式修剪这些东西?
    • 哎呀没关系我修好了,非常感谢!我使用了您编辑中的 itertools 行,第二行使用了 print>>f, '%s%s' %(i,j)(供将来想知道的任何人使用)
    【解决方案2】:

    你应该使用zip函数:

    此函数返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。

    for a, b in zip(lis1, list2):
    write(a, b)
    

    【讨论】:

      【解决方案3】:
      >>> list1 = ['a', 'b', 'c', 'd', 'e']
      >>> list2 = [1, 2, 3, 4, 5]
      >>> map(lambda x:x[0]+str(x[1]),zip(list1,list2))
      ['a1', 'b2', 'c3', 'd4', 'e5']
      

      没有zip():

      >>> map(lambda x,y:x+str(y), list1,list2)
      ['a1', 'b2', 'c3', 'd4', 'e5']
      

      编辑: If the list2 is list2 = [1, 2, 3, 4, 5,6,7] 然后使用 izip_longest

      >>> from itertools import zip_longest
      >>> [y[0]+str(y[1]) if y[0]!=None  else y[1] for y in izip_longest(list1,list2,fillvalue=None)]
      ['a1', 'b2', 'c3', 'd4', 'e5', 6, 7]
      

      【讨论】:

        【解决方案4】:

        简单...爱你的 Python :)

        >>> from itertools import *
        >>> L1 = list("abcde")
        >>> L2 = range(1,8)
        >>> [(x if x != None else '') + str(y) for (x,y) in izip_longest(L1,L2)]
        ['a1', 'b2', 'c3', 'd4', 'e5', '6', '7']
        >>> print '\n'.join([(x if x != None else '') + str(y) for (x,y) in izip_longest(L1,L2)])
        a1
        b2
        c3
        d4
        e5
        6
        7
        

        【讨论】:

          【解决方案5】:

          一个班轮:

          print "\n".join(("%s%s" % t for t in zip(list1, list2)))
          

          【讨论】:

          • print "\n".join(("%s%s" % t for t in zip(list1, list2))) 更短:)
          • @MariaZverina 哈哈很好,我已经有一段时间没有使用 python 了。忘记了您不需要明确说明元组扩展
          猜你喜欢
          • 1970-01-01
          • 2015-12-27
          • 1970-01-01
          • 2012-10-06
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多