比较元组列表和匹配值的返回指数

时间:2018-04-03 10:44:13

标签: python tuples

我是编程新手,在练习中遇到了一些麻烦。目标是编写一个返回匹配项列表的函数。

项目由带有字母和数字的元组定义,如果出现以下情况,我们认为第1项与第2项相匹配:

  1. 他们的字母都是元音(aeiou),或两者都是辅音
    1. 他们的数字之和是3
    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)]
      

      非常感谢任何帮助!

3 个答案:

答案 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.combinationsenumerate来迭代所有组合和输出索引。组合不包括排列,因此您不会看到重复。

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)]