首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python无法在变量中存储函数结果

python无法在变量中存储函数结果
EN

Stack Overflow用户
提问于 2018-06-12 05:07:27
回答 3查看 186关注 0票数 0

我编写了以下代码来帮助我抓取文件中的重复行,并列出每个重复行的行号。

当函数中没有时,这段代码可以运行。但是,当我将代码放入如下所示的函数中时,它的行为并不像我期望的那样。

我希望"getallDups“函数的值存储在变量数据中。

#!/usr/bin/env python

filename = '/tmp/test.txt'
f = open(filename, "r")
contentAslist = f.read().splitlines()
def getallDups():
    lc = 0
    mystring = ""
    for eitem in contentAslist:
        lc += 1
        if contentAslist.count(eitem) > 1:
            mystring = lc,eitem
            return(mystring)

data = getallDups()
print data

上面的代码只存储第一个重复的行。它不会列出所有重复的行。

如何才能修改这段代码以精确地执行我想要的操作?如何将其修改为将已定义函数的值存储在变量"data“中,然后我可以使用该变量。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-12 05:25:43

return语句放入函数内的循环中:返回导致函数在其第一次迭代时结束...可能的方法是返回一个列表(并在循环中收集字符串)或将函数更改为生成器。

返回列表:

filename = '/tmp/test.txt'
f = open(filename, "r")
contentAslist = f.read().splitlines()
def getallDups():
    mylist = []
    lc = 0
    for eitem in contentAslist:
        lc += 1
        if contentAslist.count(eitem) > 1:
            mylist.append((lc, eitem))      # append the duplicated line to a list
    return mylist                           # return the fully populated list

data = getallDups()
print data

生成器版本:

filename = '/tmp/test.txt'
f = open(filename, "r")
contentAslist = f.read().splitlines()
def getallDups():
    mylist = []
    lc = 0
    for eitem in contentAslist:
        lc += 1
        if contentAslist.count(eitem) > 1:
            yield (lc, eitem)    # yield duplicate lines one at a time

data = list(getallDups())        # build a list from the generator values
print data
票数 1
EN

Stack Overflow用户

发布于 2018-06-12 05:24:53

这里的问题是您在循环中返回,这意味着您永远不会获得剩余的数据。您可以通过简单地将return替换为yield并将检索调用更改为:

data = list(getallDups())

这将允许您的循环完全完成。

票数 1
EN

Stack Overflow用户

发布于 2018-06-12 05:40:53

如果你想让它返回更多的结果,它需要计算更多的结果。您需要的不是返回找到的第一个匹配项,而是将该结果添加到列表中,并返回列表:

contentAslist = [
    "abcd",
    "efgh",
    "abcd",
    "ijk",
    "lmno",
    "ijk",
    "lmno",
    "ijk",
]

def getallDups():
    lc = 0
    result = []
    for eitem in contentAslist:
        lc += 1
        if contentAslist.count(eitem) > 1:
            result.append((lc, eitem))
    return result

data = getallDups()
print data

然而,这是一个非常低效的方法,O(N^2),因为对于列表中的N个项目,list.count()方法是O(N),并且我们调用它N次。

更好的方法是使用散列。请注意,这里的返回类型非常不同,但可能更有用,并且可以很容易地转换为原始形式。

import collections
contentAslist = [
    "abcd",
    "efgh",
    "abcd",
    "ijk",
    "lmno",
    "ijk",
    "lmno",
    "ijk",
]
def getallDups():
    lc = 1
    # OrderedDict is same as "{}" except that when we iterate them later they're in the order that we added them.
    lhash = collections.OrderedDict()
    for line in contentAslist:
        # get list of line numbers matching this line, or empty list if it's the first
        line_numbers = lhash.get(line, [])
        # add this line number to the list
        line_numbers.append(lc)
        # Store the list of line numbers matching this line in the hash
        lhash[line] = line_numbers
        lc += 1

    return lhash

data = getallDups()

for line, line_numbers in data.iteritems():
    if len(line_numbers) > 1:
        print line, ":",
        for ln in line_numbers:
            print ln,
        print

上面的解是O(N)。

示例输入:

abcd
efgh
abcd
ijk
lmno
ijk
lmno
ijk

输出:

abcd : 1 3
ijk : 4 6 8
lmno : 5 7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50806040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档