在python中的列表内交换

时间:2015-03-13 16:56:18

标签: python dictionary itertools

假设我有两个包含以下元素的列表。 即。

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

l1的每个元素都与同一索引中l2中的对应元素相关。如果用户输入列表l1,则输出为l2。假设用户输入['a','c','b']等列表,则输出应为[1,3,2]。 我该如何做以下功能?更简单的方法是使用一个字典,将l1的每个元素与l2的元素相对应。但我正在寻找更好的方法,如果不是更小的代码.. 另一个例子(Just In Case)

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]

但是这对其他映射的扩展性不高,如果您的输入没有严格定义,可能会导致意外问题。

答案 2 :(得分:0)

在纯Python中,尝试:

l2[l1.index('b')]

作为一种功能,这看起来像:

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

如果你愿意,你可以通过在列表中添加类包装器和一些错误处理等来进一步复杂化,但我不知道它是否值得。