2013-10-08 33 views
1

我想比较先前已拆分并再次匹配的两个列表。将列表的一部分与Python中的完整列表进行比较

我有两个列表。未分割的一个和分割的一个

list1 = ['store1 120', 'store2 140', 'store3 160', 'store4 150'] 
list2 = [120, 140, 150, 160] 

第二个列表已被转换为整数并按大小排序。我想看看是否可以比较两个列表,因为'store1 120'与'120'最相似,并且会返回整个字符串,因此可以再次分割并返回商店名称。我怎样才能比较这两个列表来返回最相似的?大多数搜索只返回单个整数列表,这些列表不是很有用。

编辑: 为了澄清我需要的东西,可以从已经修改的列表中取一个数字并返回一个类似列表上的关联位置。原始列表可以并且会有所不同,因此它需要依赖于输入而不是预定义的定义。

+0

*与*最常见*你是指*等于*还是你正在寻找的数字匹配在一定的容忍度内或者可能找到*最接近的*号的商店? – wwii

+1

'最常见'是一个非常不精确的术语。结果你得到了很多混合的答案。请澄清你的意思,正如@wwii所说。 – roippi

回答

2

夫妇的事情要考虑

  1. 你的第一个列表仅仅是一个名称和一些它是出现在第二个列表中的级联。
  2. 的数量总是在字符串
  3. 搜索列表中的第一个列表中每个项目的到底是不是非常有效

解决方案

  1. 要解决(1)和( 2),只需在空间上执行一个正确的分区并提取名称和编号
  2. 解决方法(3),使用集合而不是列表

演示

>>> list2 = [120, 140, 150, 160] 
>>> set2 = set(list2) 
>>> for e in list1: 
    name, _, num = e.rpartition(' ') 
    if int(num) in set2: 
     print name 


store1 
store2 
store3 
store4 
+0

谢谢。这是有效的。它是即插即用的,而不是依赖于定义。我需要使用一组不同的数据。 – paumanok

1

像你想储存的数字存储名字字典这听起来我。您只需使用list1就可以做到这一点。

>>> d = dict([z.split() for z in list1]) 
>>> d 
{'store4': '150', 'store3': '160', 'store2': '140', 'store1': '120'} 

现在你只需要反过来。现在

>>> inv_map = {int(v):k for k, v in d.items()} 
>>> inv_map 
{160: 'store3', 120: 'store1', 140: 'store2', 150: 'store4'} 

可以使用list2拿到店里名称或者只是去通过键值对。

>>> for x in list2: 
... print inv_map[x] 
... 
store1 
store2 
store4 
store3 
+2

代码中存在大量问题和冗余。 1. dict接受一个生成器表达式,所以你不需要传入一个列表。 2.你可以很容易地在你的第一个表达式中反转分割对3.你假设这个名字没有空格。 '在dict(z.rsplit()[:: - 1])中对于列表1中的z有点''会更合适。 – Abhijit

+0

@Ahhijit我真的很感激回应。这只是我在思考问题时的想法。我同意这不是你明确指出的最好的方法。 – Freddie

1

使用字典(散/图),因为你拆表,保存在查找字典中的项目,

#You have: 

list1 = ['store1 120', 'store2 140', 'store3 160', 'store4 150'] 
list2 = [120, 140, 150, 160] 

#While building list2, build lookup, 

lookup = {} 
lookup[120]= 'store1 120' 
lookup[140]= 'store2 140' 
lookup[150]= 'store3 150' 
lookup[160]= 'store4 160' 
print "store: "+str(150)+", "+lookup[150]; 

#delete one, 
del lookup[160]; 
0

效率没有提到在寻求一个答案,从而为每列表2中的号码查看列表1中是否存在具有该号码的商店。

list1 = ['store1 120', 'store2 140', 'store3 160', 'store4 150'] 
list2 = [120, 140, 150, 160] 

for number in list2: 
    for store in list1: 
     if str(number) in store: 
      print 'number:', number, 'store:', store.split()[0] 

产地:

>>> 
number: 120 store: store1 
number: 140 store: store2 
number: 150 store: store4 
number: 160 store: store3 
>>> 

如果你只需要通过他们的使用次数list.sort商店名称进行排序()。

list1.sort(key = lambda item: item.split()[1]) 
print '\n'.join(item.split()[0] for item in list1) 
+0

弗雷迪的回答非常漂亮,如果你这么做的话,你会更好。 – wwii

相关问题