python - 使用元组作为索引来比较列表中的项目
问题描述
我有一个包含三个元组的列表和一个包含三个字符串的列表:
pairs = [(0, 1), (0, 2), (1, 2)]
values = ['aac', 'ccc', 'caa']
我想使用对的元素作为索引,以下列方式比较字符串:
- 第一对索引
(0, 1)
对每个字符串的第一个字母进行操作:a
从第一个字母开始,c
从第二个字母开始,从c
第三个字母开始。也就是说,它比较 index0
和1
sequence的值a, c, c
。由于a
在词法上小于c
,所以这个比较应该给出'smaller'
。 - 第二对是
(0, 2)
并且在每个字符串的第二个字母上运行:a, c, a
. 既然他们都是a
,结果应该是'equal'
。 - 最后,
(1, 2)
选中c, c, a
,得到'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")
使用索引 0、1 或 2选择适当的关键字 - Python 在添加布尔值(比较结果)时将 True 视为 1,将 False 视为 0,因此如果 v[x] 大于 v[y],则索引将为 1+1,如果 v[x] 为,则索引将为 0+1等于 v[y],否则为零。顺便说一句,您不需要 ord() 来比较字符。
推荐阅读
- r - 数据框:降序排序不起作用
- c++ - 在等待 std::condition_variable 时如何处理系统时钟的变化?
- grails - Grails 数据库迁移插件似乎不适用于 Grails 3.3.1
- mongodb - NoSql DB 的设计模式可以用来为 Firestore Firebase 数据库建模吗?
- express - 如何使用 app.use('/my/api', handlers);
- python - Discord Bot w/ Discord.py 跳线
- data-structures - Union-Find结构中m个操作的时间复杂度分析
- angular - 如何在整个应用程序中保持数据同步?
- java - 将 MySQL json 列映射到 JPA 会引发错误
- rest - 在 REST api 中的多对多关系中关联/分离条目的正确方法是什么?