[英]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
中索引0
和1
处的值。 由于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 个索引对)("smaller","equal","bigger")
选择适当的关键字你的代码很好,只有一些地方需要改进。
无需比较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.