1

我想比较之前拆分并再次匹配的两个列表。

我有两个清单。未拆分的和拆分的

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

第二个列表已经变成整数并按大小排序。我想看看我是否可以比较这两个列表,因为 'store1 120' 与 '120' 最相似,并且会返回整个字符串,因此可以再次拆分并仅返回商店名称。如何比较这两个列表以返回最相似的?大多数搜索只返回不是很有用的单个整数列表。

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

4

4 回答 4

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
于 2013-10-08T03:04:35.047 回答
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
于 2013-10-08T03:08:17.570 回答
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];
于 2013-10-08T03:09:22.137 回答
0

在寻求答案的过程中没有提到效率,因此对于 list2 中的每个数字,查看 list1 中是否存在具有该数字的商店。

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)
于 2013-10-08T03:11:54.387 回答