Fel*_*bek 3 python list-comprehension
特定
userplays = { "Alice" : { "AC/DC" : 2,
"The Raconteurs" : 3,
"Mogwai" : 1
},
"Bob" : { "The XX" : 4,
"Lady Gaga" : 3,
"Mogwai" : 1,
"The Raconteurs" : 1
},
"Charlie" : { "AC/DC" : 7,
"Lady Gaga" : 7
}
}
Run Code Online (Sandbox Code Playgroud)
获取所有乐队的列表:
['Lady Gaga', 'Mogwai', 'AC/DC', 'The Raconteurs', 'The XX']
Run Code Online (Sandbox Code Playgroud)
我可以
list(set(flatten([ [ band
for band
in playcounts.keys() ]
for playcounts
in userplays.values() ] ) ) )
Run Code Online (Sandbox Code Playgroud)
哪个flatten
来自Flatten(一个不规则的)列表列表,但有没有flatten
,只使用list/dict理解?
这样做:
set(b for v in userplays.values() for b in v.keys())
Run Code Online (Sandbox Code Playgroud)
生产:
set(['Lady Gaga', 'Mogwai', 'AC/DC', 'The Raconteurs', 'The XX'])
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用字典理解(Python 2.7+):
{k:v for v in userplays.values() for k in v.keys()}.keys()
Run Code Online (Sandbox Code Playgroud)
生产:
['Lady Gaga', 'Mogwai', 'AC/DC', 'The Raconteurs', 'The XX']
Run Code Online (Sandbox Code Playgroud)
至少在Python 3.3中,这也更快:
import timeit
userplays = { "Alice" : { "AC/DC" : 2,
"The Raconteurs" : 3,
"Mogwai" : 1
},
"Bob" : { "The XX" : 4,
"Lady Gaga" : 3,
"Mogwai" : 1,
"The Raconteurs" : 1
},
"Charlie" : { "AC/DC" : 7,
"Lady Gaga" : 7
}
}
def f1():
set(b for v in userplays.values() for b in v.keys())
def f2():
{k:v for v in userplays.values() for k in v.keys()}.keys()
t1=timeit.Timer(f1).timeit(10000)
t2=timeit.Timer(f2).timeit(10000)
faster=abs(t1-t2) / max(t1,t2)
print("""
set: {:.4} seconds
dict: {:.4} seconds
faster of those is {:.4%} faster
""".format(t1,t2,faster))
Run Code Online (Sandbox Code Playgroud)
输出:
set: 0.02448 seconds
dict: 0.01988 seconds
faster of those is 18.7907% faster
Run Code Online (Sandbox Code Playgroud)
编辑
仅仅为了纯粹的好奇心,我比较了在单行中可以做到的各种方式.
结果如下:
f1: set from a generator expression
f2: keys from a dict comprehension
f3: set comprehension
f4: set from a list comprehension
rate/s f4 f1 f2 f3
f4 358,650 0.0% -13.4% -31.7% -41.3%
f1 414,246 15.5% 0.0% -21.1% -32.2%
f2 525,230 46.4% 26.8% 0.0% -14.1%
f3 611,158 70.4% 47.5% 16.4% 0.0%
Run Code Online (Sandbox Code Playgroud)
你可以看到集合理解是最快的,然后是字典理解.
以下是生成Perl样式基准的代码:
import timeit
import locale
locale.setlocale(locale.LC_NUMERIC, "")
userplays = { "Alice" : { "AC/DC" : 2,
"The Raconteurs" : 3,
"Mogwai" : 1
},
"Bob" : { "The XX" : 4,
"Lady Gaga" : 3,
"Mogwai" : 1,
"The Raconteurs" : 1
},
"Charlie" : { "AC/DC" : 7,
"Lady Gaga" : 7
}
}
def f1():
"""set from a generator expression"""
set(b for v in userplays.values() for b in v.keys())
def f2():
"""keys from a dict comprehension"""
{k:v for v in userplays.values() for k in v.keys()}.keys()
def f3():
"""set comprehension"""
{b for v in userplays.values() for b in v.keys()}
def f4():
"""set from a list comprehension"""
set([b for v in userplays.values() for b in v.keys()])
def test_table(funcs, c):
results={k.__name__:timeit.Timer(k).timeit(c) for k in funcs}
fastest=sorted(results,key=results.get, reverse=True)
table=[]
table.append([' ','rate/s']+fastest)
for e in fastest:
temp=[]
temp.append(e)
temp.append(int(round(float(c)/results[e])))
t2=['{:.1%}'.format((results[x]-results[e])/results[e]) for x in fastest]
table.append(temp+t2)
print()
for e in funcs:
print('{}: {}'.format(e.__name__, e.__doc__))
print()
pprint_table(table)
def format_num(num):
"""Format a number according to given places.
Adds commas, etc. Will truncate floats into ints!"""
try:
inum = int(num)
return locale.format("%.*f", (0, inum), True)
except (ValueError, TypeError):
return str(num)
def get_max_width(table, index):
"""Get the maximum width of the given column index"""
return max([len(format_num(row[index])) for row in table])
def pprint_table(table):
col_paddings = []
for i in range(len(table[0])):
col_paddings.append(get_max_width(table, i))
for row in table:
# left col
print(row[0].ljust(col_paddings[0] + 1),end=' ')
# rest of the cols
for i in range(1, len(row)):
col = format_num(row[i]).rjust(col_paddings[i] + 2)
print (col,end=' ')
print()
test_table([f1,f2,f3,f4],100000)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
165 次 |
最近记录: |