我有一个列表如下:
names_list = [
["first='Katie'", "last='Beckett'"],
["first='David'", "last='Seal'"],
["first='Eric'", "last='Swartz'"]
]
我想将其转换为这种格式:
object.filter(first='Katie', last="Beckett') | object.filter(first='David', last='Seal' | object.filter(first='Eric', last="Swartz')
这就是我一直在尝试的:
def convert(list):
for i in list:
return reduce(lambda x,y: objects.filter + '(' + x + ', ' + y + ')' , i)
map(lambda i: convert(i), names_list ))
答案 0 :(得分:2)
"意外编程"方法(即在没有丝毫理解的情况下随意尝试任何事情,并希望它能够神奇地进行#34;某种工作")不会让你走得太远。您需要了解您正在做什么以及为什么做。
第一点:你的目标是一个Python表达式,而不是数据,所以你想要的不是"转换"您的源数据"为另一种格式"但要动态构建(和评估)源数据中的表达式。
第二点:你的源数据格式是完全错误的,你不想要文字" first =< ...>"字符串在这里,但很明显是一个dicts列表,即:
names_list = [
{"first":'Katie', "last":'Beckett'},
{"first":'David', "last":'Seal'},
{"first":'Eric', "last":'Swartz'}
]
这允许您在函数调用中使用dict解包,即:
target = names_list[0]
result = object.filter(**target)
第三点:objects.filter + '(' + x + ', ' + y + ')'
并不意味着什么 - 试图添加一个函数和一个字符串只是不起作用。不管怎么说不要尝试将Python表达式构建为字符串,Python具有足够的表现力和动态性,可以让你在没有这些肮脏黑客的情况下解决这些问题。
你想要的是1.构建一系列调用(调用的结果)到object.filter()
然后2."或"这些结果在一起。
第一步很简单:
items = [object.filter(**target) for target in names_list]
第二步是"减少"这个序列使用" biwise或"运算符(|
)。 reduce()
确实是正确的功能,你只需要一个功能,你需要两个项目和#34;或者"他们。天真的方法是使用lambda:
result = reduce(lambda y, x: x | y, items)
但是这是一个重新发明轮子的情况,因为Python的运算符(以及大多数运算符)存在于operator
模块的函数版本中:
import operator
result = reduce(operator.or_, items)