在 python 的列表内交换

swapping inside the list in 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]

纯Python,试试:

l2[l1.index('b')]

作为一个函数,它看起来像:

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

如果你愿意,你可以通过在列表周围添加一个 class 包装器,以及一些错误处理等等,使这个更复杂,但我不知道它是否值得。

你应该使用 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 上

我假设您希望他们按如下方式排列:

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]

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