48

我有两个列表,我想按元素连接它们。列表之一在连接之前经过字符串格式化。

例如 :

a = [0, 1, 5, 6, 10, 11] 
b = ['asp1', 'asp1', 'asp1', 'asp1', 'asp2', 'asp2']

在这种情况下,a会进行字符串格式化。也就是说,新的aaa应该是:

aa = [00, 01, 05, 06, 10, 11]

最终输出应该是:

c = ['asp100', 'asp101', 'asp105', 'asp106', 'asp210', 'asp211']

有人可以告诉我该怎么做吗?

4

11 回答 11

59

使用zip

>>> ["{}{:02}".format(b_, a_) for a_, b_ in zip(a, b)]
['asp100', 'asp101', 'asp105', 'asp106', 'asp210', 'asp211']
于 2013-10-24T07:54:15.057 回答
33

使用拉链

[m+str(n) for m,n in zip(b,a)]

输出

['asp10', 'asp11', 'asp15', 'asp16', 'asp210', 'asp211']
于 2013-10-24T07:59:22.613 回答
8

其他解决方案(更喜欢printf 格式化样式而不是.format()使用),它也更小:

>>> ["%s%02d" % t for t in zip(b, a)]
['asp100', 'asp101', 'asp105', 'asp106', 'asp210', 'asp211']
于 2013-10-24T08:19:40.960 回答
5

可以用 map 和 zip 优雅地完成:

map(lambda (x,y): x+y, zip(list1, list2))

例子:

In [1]: map(lambda (x,y): x+y, zip([1,2,3,4],[4,5,6,7]))
Out[1]: [5, 7, 9, 11]
于 2013-10-24T07:53:48.747 回答
3

输入:

a = [0, 1, 5, 6, 10, 11] 
b = ['asp1', 'asp1', 'asp1', 'asp1', 'asp2', 'asp2']

concat_func = lambda x,y: x + "" + str(y)

list(map(concat_func,b,a)) # list the map function

输出:

['asp10', 'asp11', 'asp15', 'asp16', 'asp210', 'asp211']
于 2018-08-04T17:09:01.447 回答
3

如果你想连接任意数量的列表,你可以这样做:

In [1]: lists = [["a", "b", "c"], ["m", "n", "o"], ["p", "q", "r"]] # Or more

In [2]: lists
Out[2]: [['a', 'b', 'c'], ['m', 'n', 'o'], ['p', 'q', 'r']]    

In [4]: list(map("".join, zip(*lists)))
Out[4]: ['amp', 'bnq', 'cor']
于 2018-11-19T16:46:18.793 回答
2

不使用拉链。我不知道,我认为这是显而易见的方法。也许我刚学了 C :)

c=[]
for i in xrange(len(a)):
    c.append("%s%02d" % (b[i],a[i]))
于 2013-10-24T07:56:34.827 回答
1
b = ['asp1', 'asp1', 'asp1', 'asp1', 'asp2', 'asp2']
aa = [0, 1, 5, 6, 10, 11]
new_list =[]
if len(aa) != len(b):
     print 'list length mismatch'
else:
    for each in range(0,len(aa)):
        new_list.append(b[each] + str(aa[each]))
print new_list
于 2013-10-24T08:09:22.770 回答
0

我最终使用了一个临时 DataFrame,它可读且快速:

a = ["a", "b", "c"]
b = ["1", "2", "3"]

df = pd.DataFrame({"a": a, "b": b})
df["c"] = df.a + df.b
result = df.c.values

输出:

$ result 
["a1", "b2", "c3"]

在幕后,DataFrames 使用 numpy,因此结果是高效的。


和函数一样:

import pandas as pd
from typing import List
def _elementwise_concat(self, a: List[str], b: List[str]) -> List[str]:
    """
    Elementwise concatenate.
    :param a: List of strings.
    :param b: List of strings.
    :return: List, same length, strings concatenated.
    """
    df = pd.DataFrame({"a": a, "b": b})
    df["c"] = df.a + df.b
    return df.c.values
于 2021-04-17T10:40:21.263 回答
0

列表理解 //zip()使用zfill()to 格式。

print ([y+str(x).zfill(2) for x,y in zip(a,b)])

输出:

['asp100', 'asp101', 'asp105', 'asp106', 'asp210', 'asp211']
于 2021-04-17T10:54:00.693 回答
0

使用lambdaformat

b = ['asp1', 'asp1', 'asp1', 'asp1', 'asp2', 'asp2']
a = [0, 1, 5, 6, 10, 11]

list(map(lambda x: x[0] + "{0:0=2d}".format(x[1]), zip(b, a)))

出去:

['asp100', 'asp101', 'asp105', 'asp106', 'asp210', 'asp211']
于 2021-08-02T13:13:21.133 回答