在Python 2.7.2中连接嵌套列表的字符串

2 投票
4 回答
693 浏览
提问于 2025-04-17 09:29

我有一系列的列表,每个列表里包含一个整数和一个嵌套的字符串列表。我的目标是把这些字符串合并成一个字符串。我已经用代码成功处理了一个列表。但当我尝试对这系列列表进行循环时,出现了一个错误:“TypeError: sequence item 0: expected string, int found.” 我尝试过把整数转换成字符串,忽略整数项,并直接处理嵌套列表,但都没有成功。

系列的例子:

    [19497, ['83', 'CLM']]
    [19498, ['80', 'COS', 'PAN', '83', 'CLM']]
    [19505, ['79', 'MXE', 'MXN', 'MXS']]
    [19507, ['83', 'CLM', 'ECU']]
    [19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']]

这段代码可以处理一个列表:

    >>> q = [48, ['40', 'ASS', 'EHM', 'IND', 'NEP', 'WHM', '41', 'MYA']]
    >>> q[1] = " ".join(q[1])
    >>> q
    [48, '40 ASS EHM IND NEP WHM 41 MYA']

这是我在循环时尝试的代码,但出现了类型错误。

    def smush(q):
        '''STILL IN PROGRESS: Trying to create single string in nested list.'''
        for line in q:
            q[1] = ' '.join(q[1])
        return q

我觉得这里可能有个简单的解决办法我没有注意到。有什么建议吗?

谢谢你们提供的任何帮助。

4 个回答

0

一个列表推导式可以简洁地完成你想要的操作:

a = [[19497, ['83', 'CLM']],
     [19498, ['80', 'COS', 'PAN', '83', 'CLM']],
     [19505, ['79', 'MXE', 'MXN', 'MXS']],
     [19507, ['83', 'CLM', 'ECU']],
     [19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']]]

def smush(q):
    '''Implemented as a list comprehension.'''
    return [[x[0], ' '.join(x[1])] for x in q]

假设a是上面定义的嵌套列表,当你把它传给smush时,它会返回:

In [1]: smush(a)
Out[1]: 
[[19497, '83 CLM'],
 [19498, '80 COS PAN 83 CLM'],
 [19505, '79 MXE MXN MXS'],
 [19507, '83 CLM ECU'],
 [19509, '79 MXG MXS MXT 80 BLZ GUA HON NIC']]

PEP 202中有这样的描述:

列表推导式提供了一种更简洁的方式来创建列表,适用于那些通常需要用到map()、filter()或者嵌套循环的情况。

0

下面这个代码可以直接使用(没有任何错误处理):

lines = [
     [19497, ['83', 'CLM']],
     [19498, ['80', 'COS', 'PAN', '83', 'CLM']],
     [19505, ['79', 'MXE', 'MXN', 'MXS']],
]

def smush(lines):
    new_lines = []
    for line in lines:
        new_line = [line[0], ' '.join(line[-1])]
        new_lines.append(new_line)
    return new_lines

print smush(lines)
# [[19497, '83 CLM'], [19498, '80 COS PAN 83 CLM'], [19505, '79 MXE MXN MXS']]
1

你已经很接近了:

def smush(lists):
    for line in lists:
        line[1] = ' '.join(line[1])
    return lists # optional, since this modifies the list in-place

如果每个项目都是正好包含两个元素的列表,建议你使用元组,像这样:

data = [    
    (19497, ['83', 'CLM']),
    (19498, ['80', 'COS', 'PAN', '83', 'CLM']),
    (19505, ['79', 'MXE', 'MXN', 'MXS']),
    (19507, ['83', 'CLM', 'ECU']),
    (19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']),
]

dataInStringFormat = [(n, ''.join(l)) for n,l in data]

撰写回答