社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

Kelly Bundy

Kelly Bundy 最近创建的主题
Kelly Bundy 最近回复了
3 年前
回复了 Kelly Bundy 创建的主题 » 带有for/if的Python转换和过滤器列表

代替 let transformed = transform(el) 具有 for transformed in [transform(el)] .

更多变化:

from itertools import cycle
from operator import add

A = ['A','B','C','D','E','F','G','H']
B = ['a','b']
E = ['Aa','Bb','Ca','Db','Ea','Fb','Ga','Hb']

C = list(map(add, A, cycle(B)))
print(C == E)

C = [a + B[i%2] for i, a in enumerate(A)]
print(C == E)

C = list(map(''.join, zip(A, cycle(B))))
print(C == E)

C = list(map('{}{}'.format, A, cycle(B)))
print(C == E)
3 年前
回复了 Kelly Bundy 创建的主题 » Python——从一个列表切换到另一个列表(最佳方式)

您可以使用二进制搜索来查找开关索引:

from bisect import bisect_left
switchIndex = bisect_left(list1, switchValue)

然后在不使用Python循环的情况下打印(哦,在Python 2中不起作用,但下面的另一个可以):

print(*list1[:switchIndex], sep='\n')
print(*list2, sep='\n')

或者:

print('\n'.join(map(str, list1[:switchIndex])))
print('\n'.join(map(str, list2)))

在Python 2中,在10万倍长的列表上与您和deceze的列表一起进行基准测试:

 51 ms   52 ms   52 ms  Kelly2
137 ms  138 ms  138 ms  original
138 ms  138 ms  138 ms  deceze1
160 ms  160 ms  161 ms  deceze2
164 ms  164 ms  165 ms  deceze3

在Python 3中:

111 ms  114 ms  114 ms  Kelly2
134 ms  134 ms  135 ms  Kelly1
176 ms  177 ms  178 ms  deceze1
178 ms  178 ms  178 ms  original
189 ms  189 ms  191 ms  deceze2
191 ms  192 ms  192 ms  deceze3

(不包括@buhtz's,因为它不太具有可比性。)

基准代码( Try it online! - Python 2 version ):

def original():
    for i in list1:
        if i < switchValue:
            print(i)
        else:
            for j in list2:
                print(j)
            break

def deceze1():
    for i in list1:
        if i >= switchValue:
            break
        print(i)
    for i in list2:
        print(i)

def deceze2():
    for i in takewhile(lambda i: i < switchValue, list1):
        print(i)
    for i in list2:
        print(i)

def deceze3():
    for i in chain(takewhile(lambda i: i < switchValue, list1), list2):
        print(i)

def Kelly1():
    switchIndex = bisect_left(list1, switchValue)
    print(*list1[:switchIndex], sep='\n')
    print(*list2, sep='\n')

def Kelly2():
    switchIndex = bisect_left(list1, switchValue)
    print('\n'.join(map(str, list1[:switchIndex])))
    print('\n'.join(map(str, list2)))

funcs = original, deceze1, deceze2, deceze3, Kelly1, Kelly2

import os, sys
from timeit import default_timer as timer
from bisect import bisect_left
from itertools import takewhile, chain

list1 = [1, 3, 5, 8]
list2 = [7, 10, 12]
switchValue = 4

for func in funcs:
    print(func.__name__ + ':')
    func()

n = 100_000
list1 = [x for x in list1 for _ in range(n)]
list2 = [x for x in list2 for _ in range(n)]

print('benchmark:')
tss = [[] for _ in funcs]
for _ in range(10):
    for func, ts in zip(funcs, tss):
        with open(os.devnull, 'w') as sys.stdout:
            t0 = timer()
            func()
            t1 = timer()
        sys.stdout = sys.__stdout__
        ts.append(t1 - t0)
        ts.sort()
for func, ts in sorted(zip(funcs, tss), key=lambda x: x[1]):
    print(*('%d ms ' % (t * 1e3) for t in sorted(ts)[:3]), func.__name__)