将每两个字符串组合成一个字符串

9

我有一个列表 a

list = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']

我希望获得一个字符串列表,例如["247400015203223811, DPF", "247400015203223813, ZPF"],将每2个字符串组合成1个字符串。
我尝试过如下方式:
list2 = []
list = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']

        for i in range(0, len(list), 2):
            list2.append(list[i] + list[i])

这真的可行吗?

9个回答

15

你差不多就做到了,可以使用这个列表推导式:

mylist = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']

mylist2 = [mylist[i]+', '+mylist[i+1]for i in range(0,len(mylist),2)]

>>> mylist2
['247400015203223811, DPF', '247400015203223813, ZPF']

请确保不要使用关键字list作为变量名称,因为它会掩盖Python的内置类型(我将其改为mylist


6

我认为在此处可以很好地使用切片和zip:

# assuming list of stringals is named `strings`
even_indexed = strings[::2]
odd_indexed = strings[1::2]

# create pairs to join
pairs = zip(even_indexed, odd_indexed)

# join all pairs
result = list(map(', '.join, pairs))

无法进行测试,但这可以说明问题。


1
str.join should be ", ".join, otherwise you'll get a TypeError - Patrick Haugh

5
当然可以,你已经接近答案了:
只需在第二个单词的索引上加1即可:
list2 = []

list1 = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']

for i in range(0, len(list1), 2):
    list2.append(list1[i] + list1[i+1])

print(list2) # OUTPUT: ['247400015203223811DPF', '247400015203223813ZPF']

但是你可能也想在这两个单词之间加上一个句点:

list2.append(list1[i] + '.' + list1[i+1]) # OUTPUT: ['247400015203223811.DPF', '247400015203223813.ZPF']

5

在列表中将项目配对的一种常见模式是获取列表上的迭代器,然后将该迭代器与自身进行 zip 操作。从那里开始,使用 str.join 调用轻松地将这些配对项连接起来,连接符为 ", "

# Don't reuse the name list, it already has a meaning
list_ = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']

it = iter(list_)

print([", ".join(pair) for pair in zip(it, it)])
# ['247400015203223811, DPF', '247400015203223813, ZPF']

哇,太聪明了!希望能给你点赞不止一次! - vishes_shell

3
import itertools

def grouper(iterable, n, fillvalue=None):
    """ Collect data into fixed-length chunks or blocks.

        grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    """
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

x = ["a", "b", "c", "d", "e"]
x_grouped = [", ".join(pair) for pair in grouper(x, 2, "")]

print(x_grouped)  # -> ['a, b', 'c, d', 'e, ']

您可以使用itertools recipe中的grouper函数。如果列表中有奇数个字符串,您可以指定一个fillvalue。


2
您可以对列表进行切片,将这些切片进行zip操作并mapjoin函数中:
l = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']
print(list(map(', '.join, zip(l[::2], l[1::2]))))

这将输出:
['247400015203223811, DPF', '247400015203223813, ZPF']

2
使用列表推导式
list = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']
res = [ ', '.join(x) for x in zip(list[0::2], list[1::2]) ]

输出:

['247400015203223811, DPF', '247400015203223813, ZPF']

2

让我们为您提供一行简洁易读的解决方案:

list_ = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']
print([", ".join(i) for i in zip(list_[0::2], list_[1::2])])
# ['247400015203223811, DPF', '247400015203223813, ZPF']

请注意:

  • list_[0::2]偶数 索引的列表元素
  • list_[1::2]奇数 索引的列表元素

2

zip函数将迭代器与列表本身一起打包,以便获得一对两个元素。

以下是原理的演示:

>>> lst = ['247400015203223811', 'DPF', '247400015203223813', 'ZPF']
>>> it = iter(lst)
>>> list(zip(it, it))
[('247400015203223811', 'DPF'), ('247400015203223813', 'ZPF')]

在列表推导式中应用该原则:

>>> [', '.join(s) for s in zip(*[iter(lst)]*2)]
['247400015203223811, DPF', '247400015203223813, ZPF']

没有需要用于切片或中间列表的额外内存。不需要玩弄索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接