2011-04-15 34 views
1

我想比较具有相同长度但内容不同的列表的列表。我的脚本应该只返回职位共享完全相同的元素(在所有列表中)。 例如:比较等长列表以找到共享相同元素的位置

l = [[1,2,3,4,5,6,7,8],[9,8,8,4,3,4,5,7,8],[ 5,6,7,4,9,9,9,8],[0,0,1,4,7,6,3,8]]

因此,我得到一个位置列表p = [3,7]在所有列表中,我们分别在位置3和7处具有'4'和'8'。

这些元素也可以是字符串,我只是用整数给出一个例子。谢谢你的帮助!

+3

我们不是写代码为您服务。你有什么尝试? – martineau 2011-04-15 16:31:19

回答

3
l = [[1,2,3,4,5,6,7,8],[9,8,8,4,3,4,5,7,8],[5,6,7,4,9,9,9,8],[0,0,1,4,7,6,3,8]] 

p = [i for i, j in enumerate(zip(*l)) if all(j[0]==k for k in j[1:])] 

# p == [3] - because of some typo in your original list, probably too many elements in the second list. 

这是这只是一个班轮(列表解析)版本,更详细:

p = [] 
for i, j in enumerate(zip(*l)): 
    if all(j[0]==k for k in j[1:]): 
     p.append(i) 

zip(*l)为您提供:

[(1, 9, 5, 0), 
(2, 8, 6, 0), 
(3, 8, 7, 1), 
(4, 4, 4, 4), 
(5, 3, 9, 7), 
(6, 4, 9, 6), 
(7, 5, 9, 3), 
(8, 7, 8, 8)] 

enumerate()放数字0,1, 2,...到该列表中的每个元组。

all(j[0]==k for k in j[1:])元组的第一个元素与所有剩余的元素进行比较,并且返回True如果它们全部都相等,False否则(它一旦它找到一个不同的元素返回False,所以它的更快)

+0

哦,谢谢,那很快;) – 2011-04-15 16:36:38

+0

关于这是如何工作的任何解释? – ulidtko 2011-04-15 16:40:52

+0

如果....是'',而不是''p = [i我是i,j在枚举(zip(* l))中是''p = [''** j [0] **' ,j in ....''' – eyquem 2011-04-15 20:18:26

0
l = [[1,2,3,4,5,6,7,8],[9,8,8,4,3,4,5,7,8],[5,6,7,4,9,9,9,8],[0,0,1,4,7,6,3,8]] 
r = [] 

for i in range(len(l[0])): 
    e = l[0][i] 
    same = True 
    for j in range(1, len(l)): 
     if e != l[j][i]: 
      same = False 
      break 
    if same: 
     r.append(i) 

print r 

仅打印[3],因为l [1]在位置7没有8。它还有一个元素。

1

我喜欢eumiro解决方案,但我做了一组

p = [i for i, j in enumerate(zip(*l)) if len(set(j)) == 1] 
+0

+1,哇我忙于'all()'解决方案,我完全忘记了'set()'。虽然这比我的解决方案慢(我的测试只要一个元素不匹配就停下来),但它看起来很棒! – eumiro 2011-04-17 06:54:56

0
li = [[1,2,3,4,5,6,7,8],[9,8,8,4,3,6,5,8],[5,6,7,4,9,9,9,8],[0,0,1,4,7,6,3,8]] 

first = li[0] 
r = range(len(first)) 
for current in li[1:]: 
    r = [ i for i in r if current[i]==first[i]] 

print [first[i] for i in r] 

结果

[4, 8] 

比较执行的时间:

from time import clock 

li = [[1,2,3,4,5,6,7,8,9,10], 
     [9,8,8,4,5,6,5,8,9,13], 
     [5,6,7,4,9,9,9,8,9,12], 
     [0,0,1,4,7,6,3,8,9,5]] 

n = 10000 

te = clock() 
for turn in xrange(n): 
    first = li[0] 
    r = range(len(first)) 
    for current in li[1:]: 
     r = [ i for i in r if current[i]==first[i]] 
    x = [first[i] for i in r] 
t1 = clock()-te 
print 't1 =',t1 
print x 


te = clock() 
for turn in xrange(n): 
    y = [j[0] for i, j in enumerate(zip(*li)) if all(j[0]==k for k in j[1:])] 
t2 = clock()-te 
print 't2 =',t2 
print y 

print 't2/t1 =',t2/t1 
print 

结果

t1 = 0.176347273187 
[4, 8, 9] 
t2 = 0.579408755442 
[4, 8, 9] 
t2/t1 = 3.28561221827 

随着

li = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2,22,26,24,25], 
     [9,8,8,4,5,6,5,8,9,13,18,12,15,14,15,15,4,16,19,20,2,158,35,24,13], 
     [5,6,7,4,9,9,9,8,9,12,45,12,4,19,15,20,24,18,19,20,2,58,23,24,25], 
     [0,0,1,4,7,6,3,8,9,5,12,12,12,15,15,15,5,3,14,20,9,18,28,24,14]] 

结果

t1 = 0.343173188632 
[4, 8, 9, 12, 15, 20, 24] 
t2 = 1.21259110432 
[4, 8, 9, 12, 15, 20, 24] 
t2/t1 = 3.53346690385 
相关问题