首页 > 解决方案 > 使用元组作为索引来比较列表中的项目

问题描述

我有一个包含三个元组的列表和一个包含三个字符串的列表:

pairs = [(0, 1), (0, 2), (1, 2)]
values = ['aac', 'ccc', 'caa']

我想使用对的元素作为索引,以下列方式比较字符串:

所以总的预期输出如下:

['smaller', 'bigger', 'equal']

我尝试了以下代码:

n=0
for x,y in pairs:
    if ord(values[x][n])>ord(values[y][n]):
        print('bigger')
        n+=1
    elif ord(values[x][n])<ord(values[y][n]):
        print('smaller')
        n+=1
    else:
        print('equal')
        n+=1

但是,它不仅打印结果而不是构建列表,而且还给出了不正确的结果 ( smaller, equal, bigger)。如何达到我的预期结果?

标签: python

解决方案


您可以使用带有 zip 函数的列表推导来组合两个列表:

pairs  = [(0, 1), (0, 2), (1, 2)]
values = ['aac', 'ccc', 'caa']

result = [ ("smaller","equal","bigger")[(v[x]>v[y])+(v[x]>=v[y])] 
            for v,(x,y) in zip(zip(*values),pairs) ]

print(result)
['smaller', 'equal', 'bigger']
  • zip(*values)将使用每个字符串的第 n 个字符创建元组: ('a','c','c'), ('a','c','a'), ('c','c','a')
  • zip(zip(*values),pairs)将这些字符元组与每个对应的对组合:(('a','c','c'),(0,1)), (('a','c','a'),(0,2)), (('c','c','a'),(1,2))
  • 这些变成v(每个值的第 n 个字符)和x,y(第 n 个索引对)
  • 然后("smaller","equal","bigger")使用索引 0、1 或 2选择适当的关键字
  • Python 在添加布尔值(比较结果)时将 True 视为 1,将 False 视为 0,因此如果 v[x] 大于 v[y],则索引将为 1+1,如果 v[x] 为,则索引将为 0+1等于 v[y],否则为零。顺便说一句,您不需要 ord() 来比较字符。

推荐阅读