在 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]
但这对其他映射的可扩展性不是很好,如果您的输入没有严格定义,可能会导致意外问题。
假设我有两个包含以下元素的列表。 即
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]
但这对其他映射的可扩展性不是很好,如果您的输入没有严格定义,可能会导致意外问题。