拼合字符串列表

时间:2018-10-25 04:28:10

标签: python list

我有此列表:

db.getCollection('tests').aggregate([
     { $unwind : "$funding_round"},
     { $group:{
          _id: "$name",
          "avgFunding" : {"$avg" : "$funding_round.raised_amount"},
          size : {$sum: 1}
        }
     },
     { $sort: { "avgFunding": -1 } },
     { "$limit":10 }
 ])

您可以看到,由于项目已转换为字符串,因此它并不完全是字符串列表。

我想拥有这样平坦的输出:

/* 1 */
{
    "_id" : "Facebook",
    "avgFunding" : 1232.0,
    "size" : 3.0
}

只是一个简单的字符串列表。

我尝试过使用这种方式:

list1 = ["['word']", "['second', 'first']", "['first']"]

但是问题在于第二个项目仍被视为一个项目:

list2 = ['word', 'second', 'first', 'first']

所以我尝试用逗号分割:

list2 = [ x.strip('[]') for x in list1]

但是它给出了输出:

["'word'", "'second', 'first'", "'first'"]

有什么解决方法吗?

更新-解决方案

在@AKX的帮助下

{{2 }}

然后使用此功能:

list3 = [item.split(',') for x in list2 for item in x]

这将提供:

[["'"],
 ['w'],
 ['o'],
 ['r'],
 ['d'],
 ["'"],
 ["'"],
 ['s'],
 ['e'],
 ['c'],
 ['o'],
 ['n'],
 ['d'],
 ["'"],
 ['', ''],
 [' '],
 ["'"],
 ['f'],
 ['i'],
 ['r'],
 ['s'],
 ['t'],
 ["'"],
 ["'"],
 ['f'],
 ['i'],
 ['r'],
 ['s'],
 ['t'],
 ["'"]]

UPDATE 2

一种优化的替代方法@waynelpu提供的解决方案,而不是 flatten 函数,只需使用:

list2 = [ast.literal_eval(item) for item in list1]

5 个答案:

答案 0 :(得分:2)

如果您有一个表示列表的Python表达式字符串列表(嵌套子句的含义如何),则必须使用ast.literal_eval()回到现实。

>>> import ast
>>> list1 = ["['word']", "['second', 'first']", "['first']"]
>>> list2 = [ast.literal_eval(item) for item in list1]
[['word'], ['second', 'first'], ['first']]

使用ast.literal_eval()而不是危险 eval() 不应使用是安全的,因为它只计算可以没有副作用。

答案 1 :(得分:2)

list1 = ["['word']", "['second', 'first']", "['first']"]
new_lst = [sub_val for val in list1 for sub_val in eval(val)]
print new_lst

Result:['word', 'second', 'first', 'first']

答案 2 :(得分:2)

您也可以使用more_itertools.flatten

from more_itertools import flatten
import ast

list1 = ["['word']", "['second', 'first']", "['first']"]
list(flatten(ast.literal_eval(item) for item in list1))

输出:

['word', 'second', 'first', 'first']

答案 3 :(得分:1)

这是另一种解决方案:

import re
list1 = ["['word']", "['second', 'first']", "['first']"]
pattern = re.compile(r'\w+')
m = pattern.findall(str(list1))

结果:

['word', 'second', 'first', 'first']

答案 4 :(得分:1)

要使所有内容扁平化,请使用itertools.chain.from_iterable

>>> import itertools
>>> import ast
>>> list1 = ["['word']", "['second', 'first']", "['first']"]
>>> list2 = list(itertools.chain.from_iterable(map(ast.literal_eval, list1)))
>>> list2
['word', 'second', 'first', 'first']