我不能使return与print(Python)一样

时间:2018-11-21 15:39:22

标签: python

sopa=(["PATO", "BOI", "GATO", "CAO"], ["XPATOW", "GATOPA", "YWBIVZ","ZWCAOB", "ABBOIL"])

def obtem_palavras(sopa):
    return sopa[0]

def obtem_grelha(sopa):
    return sopa[1]


def encontra_palavras(sopa):
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)
    for item in tuplo_palavra:
        for item1 in tuplo_linha:
            if item in item1:
                return item, tuplo_linha.index(item1), item1.index(item)

我想要的结果是(("PATO",0,1),("BOI",4,2),("GATO",1,0),("CAO",3,2)) 通过使用return,我只能正确获得第一部分"('PATO', 0, 1)" 通过使用打印,我可以在不同的行中获取每个信息

PATO 0 1 
BOI 4 2
GATO 1 0
CAO 3 2

encontra_palavras(sopa)必须在tuplo_palavratuplo_linha中给我相同的单词,它在tuplo_linha中所处的位置,并且位置in中的项开始 我是Python的新手,我不知道是否有人可以提供帮助。我必须使用RETURN并且没有PRINT :)谢谢

3 个答案:

答案 0 :(得分:0)

sopa=(["PATO", "BOI", "GATO", "CAO"], ["XPATOW", "GATOPA", "YWBIVZ","ZWCAOB", "ABBOIL"])

def obtem_palavras(sopa):
    return sopa[0]

def obtem_grelha(sopa):
    return sopa[1]


def encontra_palavras(sopa):
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)

    final_lst=[]
    for item in tuplo_palavra:
        for item1 in tuplo_linha:
            if item in item1:
                lst=[]
                lst.append(item)
                lst.append(tuplo_linha.index(item1))
                lst.append(item1.index(item))
                final_lst.append(tuple(lst))
    return tuple(final_lst)            
encontra_palavras(sopa)

尝试使用这个!创建一个列表,在其中添加所有元组,并在函数完成执行后将其返回。

答案 1 :(得分:0)

问题出在这里

您希望函数encontra_palavrastuplo_palavra中的每个项目做一些工作,以累计(将工作结果)收集到一个集合中,然后返回该集合作为返回值。

您实际上正在做的是要求encontra_palavrastuplo_palavra中的每个项目执行一些工作,对第一个项目进行工作,然后返回单个结果,而无需访问tuplo_palavra中的其他项目。

要获得所需的结果,必须更改代码,以使将结果添加到集合中,而不是从最内层的循环中返回。在所有循环完成之后,您将返回整个集合。

它看起来像这样:

def encontra_palavras(sopa):
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)
    results = [] # make an empty list collection to hold results.
    for item in tuplo_palavra:
        for item1 in tuplo_linha:
            if item in item1:
                # add to the results collection a tuple with the result for this loop
                results.append( (item, tuplo_linha.index(item1), item1.index(item)) )

     return results # return the entire collection now that all work is done.

答案 2 :(得分:0)

您可以使用两种主要方法:您可以在for循环中创建一个元组,然后将其返回,或者可以使函数成为生成器,然后使用该生成器来构建元组。

方法1:连接到一个空的元组

def encontra_palavras(sopa):
    result = ()
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)
    for item in tuplo_palavra:
        for item1 in tuplo_linha:
            if item in item1:
                result +=  ((item, tuplo_linha.index(item1), item1.index(item)),)
    return result

这是最简单的方法,但效率不高,因为会为每个+=操作创建一个新的元组。您还可以构建一个列表,然后在返回之前将其变成元组。

方法2:元组理解(从技术上讲,是一个生成器表达式,已传递给tuple

def encontra_palavras(sopa):
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)
    return tuple((item, tuplo_linha.index(item1), item1.index(item)) 
                     for item in tuplo_palavra 
                     for item1 in tuplo_linha 
                     if item in item1)

方法3生成器

def encontra_palavras(sopa):
    result = ()
    tuplo_palavra = obtem_palavras(sopa)
    tuplo_linha = obtem_grelha(sopa)
    for item in tuplo_palavra:
        for item1 in tuplo_linha:
            if item in item1:
                yield item, tuplo_linha.index(item1), item1.index(item)

def encontra_palavras_as_tuple(sopa):
    return tuple(encontra_palavras(sopa))

如果通常只迭代encontra_palavras的结果,则此方法更好,因为您可以直接使用生成器而无需将其变成元组。这意味着您可以遍历encontra_palavras的项目而无需将其存储在内存中(这称为惰性评估)。