Py学习  »  jsbueno  »  全部回复
回复总数  5
3 年前
回复了 jsbueno 创建的主题 » Python:nested for循环被字典中的空值中断

你有这个用途 .get 方法而不是 [...] 检索值的语法。这允许您为缺失案例添加默认值。 但是,由于您是用硬编码的dict查询构建的,因此必须级联 get s用于嵌套字段检索,如果可靠的话,这可能会变得很长。 而且 收到 不检查序列中的元素:尝试从空序列检索索引0处的元素也会出错。

所以 data[symbol]['financials']['financials'][0]['netIncome'] 必须成为

(((d3 if (d3:=d2[0].get("netIncome")) else "N/A")if d2 else "N/A" )if (d2:=d1.get('financials') else "N/A") if (d1:=data[symbol].get('financials')) else "N/A"

可以清楚地看到,即使是像您这样的中等结构,这也不可行。最好的方法是构建一个helper函数,从数据的“路径”中检索嵌套数据,默认为一个值,并每次调用该函数:

def retr(obj, path, default="N/A"):
   try:
      for index in path:
          obj = obj[index]
   except (IndexError, KeyError):
      return default
   return obj

他们会打电话给 retr 要组成每个数据项,请执行以下操作:

data[symbol]['financials']['financials'][0]['cashFlow'],

变成:

retr(data, ["symbol", "financials", "financials", 0 ,"cashFlow"]),

5 年前
回复了 jsbueno 创建的主题 » python使数组变平,为什么funtools比较慢?

简而言之,函数调用和列表重新分配的开销是分开的,使用嵌套循环的算法是o(n),使用reduce的算法是o(n)。

即使算法没有什么不同,调用一个函数有“0”代价的想法来自于数学,函数是很好的理论构造。

在计算机程序中运行时,调用一个函数需要初始化一个上下文——在python中,是用局部变量创建一个frame对象。当您有参数被传递时,它意味着在元组中,参数在函数调用之前被构造,并且在函数体中被反构造(尽管这些步骤可能由实现优化)。

在2嵌套循环方法中,您只需在本机代码中迭代迭代器——尽管理论上,根据python的规范,这也意味着调用一个函数(对象的 __iter__ 方法),在本机代码迭代器的实际实现中通常要快得多。

但这并不能解释你在那里看到的不同。主要的问题是每次练习时 a + b[0].tolist() 在存储器中创建一个新的列表“c”,将“a”的值复制到该列表中,然后将b[0]中的值追加到该列表中。而这个新的列表+已经展平的元素的副本将在每个步骤中进行。在list comphrehension情况下,不会发生多余的复制-在展开父2d结构时放置新元素,python经过优化,可以预先分配空间,以供构建时生成的列表使用。

你可以创建一个对象,它有一个无限的或者一组定义好的元素,而这并不取决于你想要的元素的数量。

因此,虽然9个一组的速度不一定比创建一个列表“快”,但几百个一组的速度肯定更快,1000万或10亿个一组的速度明显更快:

class Ones:
    def __init__(self, element=1, size=9):
         self.element = element
         self.size = size
    def __getitem__(self, index):
         return self.element
    def __len__(self):
         return self.size

另外,如果只需要在重复的元素上迭代一个元素,而不需要在任意索引处获得一个元素,则可以使用 itertools.repeat :

import itertools
ones = itertools.repeat(1, size=9)
5 年前
回复了 jsbueno 创建的主题 » 基类中非继承属性上的python循环

您将所有属性作为普通值存储在实例的 __dict__ . 也就是说,没有任何进一步的暗示,它们就无法区分。

python有两种机制以特殊方式处理属性。如果要在类本身的基类中声明属性,并在 __init__ 方法,则可以内省基类 第二节 (而不是实例的 第二节 ) __annotations__ 同一类中的属性。

不过,正如在示例中一样,一件简单的事情是使用一个特殊的属性来记录在基类上添加的属性,然后将其作为属性的名称源:

class baseclass(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
        self._numeric_attrs = set(kwargs.keys())

    def calcValue(self):
        return sum(getattr(self, attr) for attr in self._numeric_attrs)
6 年前
回复了 jsbueno 创建的主题 » 在python中从sqs消息id中删除单引号

你把字符串内容误认为是字符串表示,把它弄得一团糟。

字符串作为python中的数据,在python 2中是unicode字符串或字节字符串 查看 周围的 ' 每当你看到它们的表现时,你就会引用它们。

向最终用户呈现字符串内容的方法和函数(其中包括录制然后放在文件中)确实显示了该内容,但不包含周围的引号。

在Python2中,要在控制台中查看字符串内容,可以使用 print 陈述。

将引号放在输出“.dat”文件上的代码不在此处显示-该代码将字符串放在此处。如果你自己录制一个原始文件 myfile.write(messageid) 写的时候没有引号。我倾向于认为您正在使用一些第三方代码来编写您的dat文件,将数据作为字典传入-该代码包括输出上的引号。

如果直接调用file.write,则获取这些引号的唯一方法是 repr 你的数据,比如: myfile.write(repr(messageid)) ,或者如果此MessageID位于列表或Python语句中,并且将该数据结构的字符串表示形式写入 file.write(str(my_dict_with_data))

而且,它可能有这样的理由。 .dat 是数据的通用扩展,没有真正的规范——在许多情况下,这样的数据周围的Qute(例如在JSON文件中)是可取的。