2015-03-13 6 views
-3

Предположим, что у меня есть два списка, которые содержат следующие элементы. т.е.обмен внутри списка в python

l1 = ['a','b','c'] 
l2 = [1,2,3] 

каждый элемент l1 относятся к соответствующему элементу в l2 в том же индексе. Отношение таково, что если пользователь входит в список l1, то вывод будет l2. Предположим, если пользователь входит в список, такой как ['a','c','b'], тогда выход должен быть [1,3,2]. Как я могу выполнить следующую функцию? Простой способ заключается в использовании словарь, который соответствует каждому элементу l1 к тому из l2 .Но я ищу лучший метод, если нет, то меньший код .. Другой пример (на всякий случай)

l1 = ['c','b','a'] 
l2 = [3,2,1] 
+0

A dict is easy: 'dict (zip (l1, l2)))' – tdelaney

ответ

1

Я предполагаю, что вы хотите их выстраиваться следующим образом:

a b c d e f g h i j k l ... 
1 2 3 4 5 6 7 8 9 10 11 12 ... 

вы должны определить словарь, чтобы сделать это, как вы сказали. Вы можете использовать dict(zip(...)):

def get_nums(lst): 
    letters = 'abcdefghijklmnopqrstuvwxyz' # also string.ascii_lowercase 
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26] # range(1, 27) 
    mapping = dict(zip(letters,numbers)) 
    return [mapping[lett] for lett in lst] 

Или вы могли бы просто использовать enumerate для этого

def get_nums(lst): 
    letters = 'abcdefghijklmnopqrstuvwxyz' # also string.ascii_lowercase 
    mapping = {lett:idx for idx,lett in enumerate(letters, start=1)} 
    return [mapping[lett] for lett in lst] 

Как castle-bravo указывает, для этого наивного отображения вы можете использовать что-то вроде:

def get_nums(lst): 
    return [ord(lett) - 96 for lett in lst] 

Но это не очень масштабируемо для других сопоставлений и может вызвать непредвиденные проблемы, если ваш ввод не определен строго.

0

В чистом Python, попробуйте:

l2[l1.index('b')] 

Как функция, это будет выглядеть так:

def lookup(element, l1, l2): 
    return l2[l1.index(element)] 

Вы могли бы осложнить Тхи если вы хотите, добавив оболочку класса вокруг списка, а также некоторую обработку ошибок и т. д., но я не знаю, стоит ли это или нет.

+0

OP имеет вход '['a', 'b', 'c']' и хочет вывести '[1,2, 3] '. Это не так. –

+0

Вопрос ОП не был ясен, но я понимаю, что вы имеете в виду. Он действительно хочет 'ord (l1 [i]) - 96'. –

+0

", если пользователь вводит список, такой как' ['a', 'c', 'b'] ', тогда выход должен быть' [1,3,2] '." Казалось ясным! Да, '[ord (lett) -96 для lett in l1]' должен работать. –

1

вы должны использовать list.index()

>>> l1 = ['a','b','c'] 
>>> l2 = [1,2,3] 
>>> l3 = ['c','b','a'] 
>>> l4 = [] 
>>> for item in l3: 
...  l4.append(l2[l1.index(item)]) 
>>> l4 
[3, 2, 1] 

итерацию по l3 (пользовательский ввод), чтобы получить индекс элемента на l1, использовать этот индекс для получения значения на l2, и добавить значение на l4

+0

Но я хочу вывести список, а не отдельный элемент –

+0

Я не понимаю. введите «l1 = ['c', 'b', 'a']' и 'l2 = [3,2,1]', каков должен быть выход ??? – Rod

+0

@Rod непосредственно из вопроса: «если пользователь вводит список, такой как' ['a', 'c', 'b'] ', тогда вывод должен быть' [1,3,2] '" –

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