结合列表理解的规范方法

时间:2018-06-25 14:10:16

标签: python python-2.7

我想结合一堆清单知识。

我有一个对象列表,我想生成一组列表,每个列表都包含原始列表中每个对象的某些属性。例如:

my_list = ["Kathryn", "John", "Eve", "Jack"]
initials = [x[0] for x in my_list]
upper_case = [x.upper() for x in my_list]
lower_case = [x.lower() for x in my_list]

请注意,我要遍历原始列表多次。如果我想从每个元素中获得许多不同的属性,那么我将重复很多此循环。

相反,我尝试在一次迭代中压缩获得所有属性的结果:

initials, upper_case, lower_case = zip(*((x[0], x.upper(), x.lower()) for x in my_list))

这是可行的,除了(1)我认为这段代码还不清楚,以及(2)结果变量实际上是元组而不是列表,因此要获取列表(我需要),我必须做类似的事情< / p>

initials, upper_case, lower_case = (list(x) for x in (initials, upper_case, lower_case))

,它已经存在,但是特别是如果我要提取三个以上的属性时,我也不很喜欢它的外观。 (“ ...我也不太喜欢它们的外观”?)

是否有更令人满意的“清洁”方法?

4 个答案:

答案 0 :(得分:2)

简单地,请使用for循环:

my_list = ["Kathryn", "John", "Eve", "Jack"]
initials = []
upper_case = []
lower_case = []
for x in my_list:
    initials.append(x[0])
    upper_case.append(x.upper())
    lower_case.append(x.lower())

作为一般规则:列表理解的首要目标不是要更快,而是要更具可读性(通过减少“线路噪音”)。如果使用列表推导会使代码的可读性降低,请不要使用列表推导。

NB:这当然是假设您要针对可读性进行优化-有时您确实希望针对速度进行优化,即使它会使可读性更差的代码也是如此(只要您用清晰的注释/文档进行补偿,这样您就可以几个月后必须维护该代码时,不想将自己挂在最近的树上。

答案 1 :(得分:0)

您正在考虑的问题:清晰度,元组与列表输出,可扩展性更多功能。

您不妨考虑一个功能性的解决方案,它可以增加清晰度和可扩展性。这样的解决方案可能不会比其他解决方案快。这是一个示例:

from operator import itemgetter, methodcaller

my_list = ['Kathryn', 'John', 'Eve', 'Jack']

funcs = (itemgetter(0), methodcaller('upper'), methodcaller('lower'))

i, u, l = map(list, (map(func, my_list) for func in funcs))

print(i, u, l, sep='\n')

['K', 'J', 'E', 'J']
['KATHRYN', 'JOHN', 'EVE', 'JACK']
['kathryn', 'john', 'eve', 'jack']

答案 2 :(得分:0)

另一种干燥的方法是:

def comprehend(func, iterable):
    return [func(item) for item in iterable]

my_list = ["Kathryn", "John", "Eve", "Jack"]

Initials = comprehend(lambda x:x[0], my_list)
Upper_case = comprehend(lambda x:x.upper(), my_list)
Lower_case = comprehend(lambda x:x.lower(), my_list)

答案 3 :(得分:0)

您需要的是将功能映射到列表以获取具有相同形状的另一个列表。您可以将函数指定为lambdas(匿名函数),也可以将methodcaller / itemgetter用作solution of jpp

my_list = ["Kathryn", "John", "Eve", "Jack"]

initials =  list(map(lambda x:x[0] ,my_list))
upper_case = list(map(lambda x:x.upper() ,my_list))
lower_case = list(map(lambda x:x.lower() ,my_list))
相关问题