我想结合一堆清单知识。
我有一个对象列表,我想生成一组列表,每个列表都包含原始列表中每个对象的某些属性。例如:
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))
,它已经存在,但是特别是如果我要提取三个以上的属性时,我也不很喜欢它的外观。 (“ ...我也不太喜欢它们的外观”?)
是否有更令人满意的“清洁”方法?
答案 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))