가장 빠른 방법을 사용하여 조건에서 목록의 모든 튜플 구성원을 추출합니다.파이썬에서 조건과 일치하지 않는 목록에서 요소를 추출하는 가장 빠른 방법
예 : 튜플 목록에서 (예 : [(0,0,4), (1,0,3), (1,2,1), (4,0,0)]) 첫 번째 튜플 위치에 3 개 이상, 두 번째 튜플 위치에 2 개 이상, 마지막 튜플 위치에 1 개 이상있는 모든 멤버를 추출합니다. 이 예 (4,0,0) (-> 첫 번째 조건), 아무 것도 (-> 두 번째 조건) 및 (0,0,4), (1,0,3) (-> 마지막 조건) . 이 예제는 매우 작기 때문에 수천 개의 튜플 목록에서이를 수행해야합니다. 에밀 Vikström에 의해 제안 된 같은
my_naive1 : 나는 당신의 대답에서 생성 된 코드에서
, 여기 초에서의 결과는? 13.0360000134
my_naive2 110.727999926
팀 Pietzcker 9.8329999446
돈 12.5640001297
import itertools, operator, time, copy
from operator import itemgetter
def combinations_with_replacement_counts(n, r): #(A, N) in our example.N individuals/balls in A genotypes/boxes
size = n + r - 1
for indices in itertools.combinations(range(size), n-1):
#print indices
starts = [0] + [index+1 for index in indices]
stops = indices + (size,)
yield tuple(map(operator.sub, stops, starts))
xp = list(combinations_with_replacement_counts(3,20)) # a very small case
a1=time.time()
temp=[]
for n in xp:
for n1 in xp:
for i in xp:
if i[0] <= min(n1[0],n[0]) or i[1] <= min(n1[1],n[1]) or i[2] <= min(n1[2],n[2]):
temp.append(i)
a2=time.time()
for n in xp:
for n1 in xp:
xp_copy = copy.deepcopy(xp)
for i in xp:
if i[0] > min(n[0],n[0]) or i[1] > min(n[1],n[1]) or i[2] > min(n[2],n[2]):
xp_copy.remove(i)
a3=time.time()
for n in xp:
for n1 in xp:
output = [t for t in xp if t[0]<=min(n[0],n[0]) or t[1]<=min(n[1],n[1]) or t[2]<=min(n[2],n[2])]
a4=time.time()
for n in xp:
for n1 in xp:
l1 = sorted(xp, key=itemgetter(0), reverse=True)
l1_fitered = []
for item in l1:
if item[0] <= min(n[0],n[0]):
break
l1_fitered.append(item)
l2 = sorted(l1_fitered, key=itemgetter(1), reverse=True)
l2_fitered = []
for item in l2:
if item[1] <= min(n[1],n[1]):
break
l2_fitered.append(item)
l3 = sorted(l2_fitered, key=itemgetter(2), reverse=True)
l3_fitered = []
for item in l3:
if item[2] <= min(n[2],n[2]):
break
l3_fitered.append(item)
a5=time.time()
print "soluce my_naive1, like proposed by Emil Vikström?",a2-a1
print "soluce my_naive2",a3-a2
print "soluce Tim Pietzcker",a4-a3
print "soluce Don",a5-a4
내 예는 장착이이 중 하나가 아닌 "나는 인덱스가 필요하지만 데이터베이스가 너무 쉬운 것입니다"케이스하지만 "나는 거대한 마르코프 체인의 초기 하 확률 계산을 실현하기 위해 빠른 방법이 필요합니다"입니다 , 그래서 거만한 톤을 재 포장하고, 친절 함으로 당신을 둘러싸고있는 세계에 열어보고, 당신이 도움이되지 않는다면 당신의 길을 지나쳐보십시오. 고마워요 – sol
좋아요, 나는 어떤 고 지형 확률이나 심지어 마르코프 체인 (개를 붙일 것 같은 소리가나요, 아니면 그 파블로프였습니까?),하지만 @eumiro는 중요한 질문을 제기했습니다. 출력 또는 세 개의 목록 (각 조건에 하나씩)? –
emil Vikström이 제안한 것과 같이 my_naive1을 해결 하시겠습니까? 13.0360000134 solute my_naive2 110.727999926 팀 피에츠 카 9.83299994469 돈 12.5640001297 – sol