我在寻找一种最快的方法从一个列表中提取所有的元组成员。在
示例: 从一个元组列表(例如[(0,0,4),(1,0,3),(1,2,1),(4,0,0)])中,我需要提取第一个元组位置超过3个,第二个元组位置超过2个,最后一个元组位置超过1的所有成员。 它应该在本例中提取(4,0,0)(>;第一个条件)、nothing(->;第二个条件)和(0,0,4),(1,0,3)(>;最后一个条件)。这个例子很小,我需要在数千个元组的列表上执行这个操作。在
根据我从你的回答中得到的代码,下面是第二节的结果:
我的天真,就像埃米尔·维克斯特伦的求婚?13036万134
我的天真2 110.727999926
蒂姆·皮茨克9.832999446
唐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
这很快,因为只有当
t[0]>3
是False
(第三个条件相同)时,才会计算t[1]>2
。所以在您的示例列表中,只有8个比较是必需的。在如果改用生成器表达式,则可能会节省时间和内存(取决于对过滤数据所做的操作):
^{pr2}$如果您不关心结果项的顺序,我建议在排序列表中查找,并在第一个不匹配项上设置中断条件: 这将跳过列表尾部。在
有三个列表,每个条件一个,用for循环遍历输入集,将每个元组排序到正确的目标列表中。这将在O(n)(线性)时间内执行,这是该问题最快的渐近运行时间。它也只会在列表上循环一次。在
相关问题 更多 >
编程相关推荐