我有此列表:
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'],
["'"]]
一种优化的替代方法@waynelpu提供的解决方案,而不是 flatten 函数,只需使用:
list2 = [ast.literal_eval(item) for item in list1]
答案 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']