将列表列表转换为另一种格式

时间:2016-04-05 10:18:19

标签: python

我有一个列表如下:

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 ))

1 个答案:

答案 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)