首页 > 解决方案 > 我不能让 return 和 print (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)" 通过使用 print 我得到了不同行中的每个信息

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

encontra_palavras(sopa)tuplo_palavra必须在and中给我相同的词, tuplo_linha它在 中tuplo_linha的位置,以及在 item 中开始的位置我是 Python 新手,我不知道是否有人可以提供帮助。我必须使用 RETURN 而没有 PRINT :) 谢谢

标签: python

解决方案


您可以使用两种主要方法:您可以在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而不将它们存储在内存中(这称为惰性评估)。


推荐阅读