将列表拆分为单独条目

3 投票
3 回答
1089 浏览
提问于 2025-04-16 22:59

我正在从一个CSV文件中提取一些电子邮件,然后把它们保存到另一个CSV文件里。

电子邮件的格式应该是这样的:

email = ['email@email.com'], ['email2@company.com'], ['email3@company2.com']

但是在某些情况下,它会返回成这样:

email = ['email@email.com', 'email2@email.com'], ['email3@email.com']

在某些行中,它找到了两个电子邮件,所以就会呈现成这样。

有什么有效的方法可以改变这个情况吗?

3 个回答

0
data = [ ['email@email.com', 'email2@email.com'], ['email3@email.com'] ]

def flatten(data):
    for item in data:
        if isinstance(item, basestring):
            yield item
        else:
            for i in item:
                yield [i]

或者,如果你想支持任意层级的嵌套:

def flatten(data):
    for item in data:
        if isinstance(item, basestring):
            yield [item]
        else:
            for i in flatten(item):
                yield i

如果你只需要一个邮箱列表,而不是每个元素都包裹在一个列表里(我觉得这样更合理),那么解决方案就简单多了:

import itertools
print list(itertools.chain.from_iterable(data))
0

如果你在处理CSV文件,建议你试试标准库里的CSV模块。

你可以在这里找到相关文档:http://docs.python.org/library/csv.html

下面是一个例子:

$ cat > test.csv
['email@email.com', 'email2@email.com'], ['email3@email.com']

$ python
>>> import csv
>>> reader = csv.reader(open('test.csv', 'r'))
>>> for row in reader:
...     print row
... 
["['email@email.com'", " 'email2@email.com']", " ['email3@email.com']"]

我做的这个可能不是你想要的,但如果你查看这个库,你可能会找到你需要的东西。

1

接下来这个方法应该会非常高效:

>>> import itertools
>>> data = [ ['email@email.com', 'email2@email.com'], ['email3@email.com'] ]
>>> [[i] for i in itertools.chain(*data)]
[['email@email.com'], ['email2@email.com'], ['email3@email.com']]

撰写回答