【问题标题】:Combining two lists to string [duplicate]将两个列表组合成字符串[重复]
【发布时间】:2013-03-29 12:49:54
【问题描述】:

实际上我正在尝试将两个列表合并为一个字符串但保持它们有序的含义:

list1 = [1,2,3,4,5]
list2 = ["one", "two", "three", "four", "five"]

result = "1one2two3three4four5five"

(列表的长度相同,但内容不同)

目前我正在这样做:

result = ""
i = 0

for entry in list1:
    result += entry + list2[i]
    i += 1

我认为必须有一种更 Pythonic 的方式来做到这一点,但我实际上并不知道。

希望你们中的某个人可以帮助我解决这个问题。

【问题讨论】:

    标签: python string list


    【解决方案1】:
    list1 = [1,2,3,4,5]
    list2 = ["one", "two", "three", "four", "five"]
    
    print ''.join([str(a) + b for a,b in zip(list1,list2)])
    
    1one2two3three4four5five

    【讨论】:

    • 这是与str.join() 一起使用的generator expression
    • 让它成为一个列表理解,它会更快。通过给.join() 一个生成器表达式,Python 必须无论如何从中创建一个列表,因为.join() 需要扫描输入两次,一次计算输出的总长度,一次生成输出。 [list comprehension]list(generator expression) 快。
    • @MartijnPieters 没错,但简单性可能更重要
    • 感谢您的帮助。这正是我想要的。只需要再等 7 分钟才能接受答案
    • 请注意,列表推导式只是一个更好的选择,您知道整个事情都会被耗尽。
    【解决方案2】:
    >>> import itertools
    >>> ''.join(map(str, itertools.chain.from_iterable(zip(list1, list2))))
    1one2two3three4four5five'
    

    说明:

    • zip(list1, list2) 创建一个列表,其中包含来自两个列表的匹配元素的元组:

      >>> zip(list1, list2)
      [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')]
      
    • itertools.chain.from_iterable() 将嵌套列表展平:

      >>> list(chain.from_iterable(zip(list1, list2)))
      [1, 'one', 2, 'two', 3, 'three', 4, 'four', 5, 'five']
      
    • 现在我们需要确保只有字符串,所以我们将str()应用于所有使用map()的项目

    • 最终''.join(...) 将列表项合并为一个没有分隔符的字符串。

    【讨论】:

    • 我认为这是最灵活的 Pythonic 答案。这里的优势是可以很高兴地向zip() 添加更多可迭代对象,并且它会完美运行,其他答案都需要根据可迭代对象的数量进行更改。
    • @Lattyware 灵活,是的,但对于这种特殊情况绝对是矫枉过正
    • @Lattyware:对我来说,Ashwini 的回答是最 Pythonic 的——“简单胜于复杂”,你知道的。
    • 我真的不觉得这有多复杂 - 也许这就是我。
    【解决方案3】:

    string formattingstr.join()zip() 一起使用:

    >>> list1 = [1,2,3,4,5]
    >>> list2 = ["one", "two", "three", "four", "five"]
    
    >>> "".join("{0}{1}".format(x,y) for x,y in zip(list1,list2))
    '1one2two3three4four5five'
    

    zip(list1,list2) 返回如下内容: [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')].

    现在,我们对列表中的每一项应用字符串格式,然后使用 str.join() 连接整个生成器表达式。

    【讨论】:

    • 或者只是'{}{}'.format(*p) for p in...
    • @thg435 这样更清晰
    • @jamylak:我不是format 的忠实粉丝,所以我个人会使用"%d%s" % p for p...
    • @thg435 你应该使用format(),因为它迟早会取代基于 % 的格式。 docs.python.org/release/3.0.1/whatsnew/…
    • @AshwiniChaudhary:我认为他们不敢。
    【解决方案4】:
    >>> ''.join(str(n)+s for (n,s) in zip(list1, list2))
    '1one2two3three4four5five'
    

    这里:

    • for (n,s) in zip(list1, list2) 迭代 list1list2 中的元素对(即 1"one" 等);
    • str(n)+s 将每一对转换为一个字符串(例如"1one");
    • ''.join(...) 将结果合并为一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多