繁体   English   中英

使用元组为指标,比较不同列表中的项目

[英]Using tuples as indexes to compare items across a list

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

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

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

  • 第一对索引(0, 1)在每个字符串的第一个字母上操作: a来自第一个, c来自第二个, c来自第三个。 也就是说,它比较序列a, c, c中索引01处的值。 由于a在词法上小于c ,所以这个比较应该给出'smaller'
  • 第二对是(0, 2)并且对每个字符串的第二个字母进行运算: a, c, a 由于它们都是a ,因此结果应该是'equal'
  • 最后,在c, c, a上检查(1, 2) ,结果是'bigger '。

所以总的预期输出如下:

['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 )。 我如何达到预期的结果?

您可以使用带有 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 个索引对)
  • 然后使用索引 0、1 或 2 在("smaller","equal","bigger")选择适当的关键字
  • Python 在添加布尔值(比较结果)时将 True 视为 1,将 False 视为 0,因此如果 v[x] 大于 v[y],则索引为 1+1,如果 v[x] 为 0+1等于 v[y] 否则为零。 顺便说一句,您不需要 ord() 来比较字符。

你的代码很好,只有一些地方需要改进。

无需比较ord ,可以直接比较字符。

将每个步骤保存在列表中,而不是打印

您可以使用enumerate来枚举可迭代对象:

out = []

for n, (x,y) in enumerate(pairs):
    if values[x][n]>values[y][n]:
        out.append('bigger')
    elif values[x][n]<values[y][n]:
        out.append('smaller')
    else:
        out.append('equal')
out

输出:

>>> out
['smaller', 'equal', 'bigger']

注意。 我不是在评论全局逻辑,因为你最终想要做的事情没有明确

如果你想有一个单独的输出列表,这里是解决方案。

pairs = [(0, 1), (0, 2), (1, 2)]
out = []
for x,y in pairs:
    if(x>y):
        out.append("Bigger")
    elif(x<y):
        out.appned("Smaller")
    else:
        out.appned("Equal")
print(out)

输出将是 -

['小','小','小']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM