我是编程新手,在练习中遇到了一些麻烦。目标是编写一个返回匹配项列表的函数。
项目由带有字母和数字的元组定义,如果出现以下情况,我们认为第1项与第2项相匹配:
和
注意:返回列表不应包含重复匹配 - > (1,2)包含与(2,1)相同的信息,输出列表应仅包含其中一个。
以下是一个例子:
***input:*** [('a', 4), ('b', 5), ('c', 1), ('d', 3), ('e', 2), ('f',6)]
***output:*** [(0,4), (1,2), (3,5)]
非常感谢任何帮助!
答案 0 :(得分:1)
from itertools import combinations
lst = [('a', 4), ('b', 5), ('c', 1), ('d', 3), ('e', 2), ('f',6)]
vowels = 'aeiou'
matched = [(i[0],j[0]) for (i,j) in combinations(enumerate(lst),2) if (i[1][0] in vowels) == (j[1][0] in vowels) and ((i[1][1] + j[1][1]) % 3 == 0)]
print(matched)
答案 1 :(得分:0)
对不起,我很高兴回复评论,但我会尽快编辑/更新。
我对这个问题有点困惑,如果我们在字母表中使用他们的位置作为它们的价值,这些字母的目的是什么?即a = 0,b = 1?
我们比较一个元组是什么?
由于
答案 2 :(得分:0)
您可以使用itertools.combinations
和enumerate
来迭代所有组合和输出索引。组合不包括排列,因此您不会看到重复。
from itertools import combinations
lst = [('a', 4), ('b', 5), ('c', 1), ('d', 3), ('e', 2), ('f',6)]
def checker(lst):
vowels = set('aeiou')
for (idx_i, i), (idx_j, j) in combinations(enumerate(lst), 2):
if ((i[0] in vowels) == (j[0] in vowels)) and ((i[1] + j[1]) % 3 == 0):
yield idx_i, idx_j
res = list(checker(lst))
# [(0, 4), (1, 2), (3, 5)]