2013-10-08 2 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) используйте набор вместо списка

Demo

>>> 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] для z в списке1)' было бы более подходящим. – Abhijit

+0

@Abhijit Я очень ценю ответ. Это был просто порядок моих мыслей, когда мы рассматривали проблему. И я согласен, что это не лучший подход, как вы четко указали. – 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

Ответ Freddie довольно гладкий, и вам будет лучше с ним, если вы это сделаете. – wwii

Смежные вопросы