如何在数学上减去Python中两个列表中的项目,只输出符合条件的项目?

时间:2013-07-14 02:24:25

标签: python list list-comprehension

我有两个已从低到高排序的列表:

A=['40','60','80']

B=['10','42','100']

我想在B中的每个项目中减去A中的每个项目。然后,如果这些值之间的差异满足条件,特别是,如果小于5,则从每个列表中删除两个项目,其中输出应该是:< / p>

A=['60','80']
B=['10','100']

**有时列表的长度不相等,有时每个列表中只有1个项目

我找到了很多方法来减去列表中的项目,但我不知道如何检索和删除指定列表中的特定项目,或者他们只从相反列表中的每个相应项目中减去一个项目

使用lambda:

如果列表(imap(lambda m,n:m-n&lt; 5,A,B))== True:

使用imap,sub

list(imap(sub, A, B)):

使用Numpy

M = np.array([A])

N = np.array([B])

c = abs(M-N)

非常感谢。

2 个答案:

答案 0 :(得分:1)

不使用numpy:

A = ["40", "60", "80"]

B = ["10", "42", "100"]

newA = filter(lambda a: all([abs(int(a) - int(b)) >= 5 for b in B]), A)
newB = filter(lambda b: all([abs(int(a) - int(b)) >= 5 for a in A]), B)

print newA
print newB

答案 1 :(得分:0)

A_dict = {}
B_dict = {}

for i in xrange(len(A)):
  if A[i] not in A_dict:
    A_dict[A[i]] = []
  A_dict[A[i]].append(i)


for i in xrange(len(B)):
  if B[i] not in B_dict:
    B_dict[B[i]] = []
  B_dict[B[i]].append(i)

for x in B_dict:
  for i in xrange(6):
    if x - i in A_dict:
      B_dict[x] = []
      A_dict[x-i] = []

A_new_idx = []
B_new_idx = []

for x in A_dict:
  A_new_idx.extend(A_dict[x])

for x in B_dict:
  B_new_idx.extend(B_dict[x])

A_new = [A[i] for i in sorted(A_new_idx)]
B_new = [B[i] for i in sorted(B_new_idx)]

由于要删除的最大差异为5(常量),因此运行时间为O(n log n)。应该比天真的O(n ^ 2)

快得多