在列表推导式生成器中展开元组

6

我正在使用这个函数。

def convert_tuple(self, listobj, fields=['start', 'end', 'user']):
    return [(getattr(obj, field) for  field in fields)
            for obj in listobj] 

My desired output which I want should be

[('2am', '5am', 'john'), ('3am', '5am', 'john1'), ('3am', '5am', 'john2') ]

以上函数的输出为:
[genexp, genexp, genexp] 

使用生成器表达式时,我无法像想要的那样进行扩展。

2个回答

7

将gen-exp强制转换为tuple

def convert_tuple(self, listobj, fields=['start', 'end', 'user']):
    return [tuple(getattr(obj, field) for  field in fields)
            for obj in listobj] 

差点忘记给你点赞了 ;) - Padraic Cunningham
错误。你变老了!:( - Bhargav Rao
1
我仍然可以踢你的屁股,年轻小伙子 ;) - Padraic Cunningham

5
括号创建了一个生成器表达式,根据 Bhargav的答案,生成器表达式被转换为元组,或者您可以使用map函数和operator.attrgetter
from operator import attrgetter
def convert_tuple(listobj, fields=['start', 'end', 'user']):
    return list(map(attrgetter(*fields), listobj)) # python2 just map

示例:

class Foo():
    def __init__(self):
        self.x = 1
        self.y = 2
        self.z = 3


f = Foo()
f2 = Foo()
f2.x = 10


print(convert_tuple([f,f2]))

[(1, 2, 3), (10, 2, 3)]

你可以在Python2中移除列表调用。


拼写错误的 fileds=[...] 改为 fields=[...] - Scott
只是想知道,在这种情况下,更被接受的是编辑您的答案(当有明显的拼写错误时)还是留下评论? - Scott
这是一个不错的解决方案 :) - user3214546
1
@user3214546,我在第一次阅读你的问题时弄错了,所以我不得不给你一个好答案 ;) - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接