总而言之:我需要编写一个列表推导,其中我指的是由列表推导创建的列表。
这可能不是您每天都需要做的事情,但是我也不认为这很不寻常。
也许这里没有答案-仍然,请不要告诉我我应该使用for循环。可能是正确的,但没有帮助。原因是问题域:这行代码是ETL模块的一部分,因此性能至关重要,因此避免创建临时容器也很重要-因此,我希望在L/C中对此步骤进行编码。如果for循环在这里适合我,我将只编写一个。
无论如何,我无法写出这种特殊的列表理解。原因:我需要编写的表达式具有以下形式:
[ some_function(s) for s in raw_data if s not in this_list ]
在该伪代码中,“this_list”指的是通过评估列表理解而创建的列表。这就是为什么我会坚持下去的原因-因为在评估列表理解之前不会构建this_list,并且由于在我需要引用该列表时尚未构建此列表,所以我不知道如何引用它。
到目前为止,我已经考虑了什么(尽管可能不知道确切的位置,但这可能是基于一个或多个错误的假设):
给出这份正在 build 中的 list
一个名字?我觉得
从一些用于构建的绑定(bind)方法
我的列表(“sum”?)
找到那个绑定(bind)方法并假设
确实是临时名称
python解释器用来
在它下面的时候引用列表
施工,我很确定你
无法引用绑定(bind)方法
直接地;我不知道这样的
明确的规则,但那些方法(在
至少我实际
看着)不是有效的python
句法。我猜原因之一
这样我们就不会将它们写入
我们的代码。
这就是我所谓的推理的链条,它使我得出结论,或者至少是猜测,我已经将自己编码到一个角落。我仍然认为我应该在转身并朝不同的方向之前与社区进行验证。
最佳答案
曾经有一种方法可以利用未记录的事实来完成此任务,即在构建列表时,其值存储在名为_[1].__self__
的局部变量中。但是,这在Python 2.7中就不再起作用了(也许是在更早的时候,我并没有密切注意)。
如果先设置外部数据结构,则可以在单个列表理解中执行所需的操作。由于您所有的伪代码似乎都在使用this_list
进行检查,以查看是否已存在每个s
(即成员资格测试),因此我将其更改为名为set
的seen
,以进行优化(在如果列表很大,list
可能会非常慢)。这就是我的意思:
raw_data = [c for c in 'abcdaebfc']
seen = set()
def some_function(s):
seen.add(s)
return s
print [ some_function(s) for s in raw_data if s not in seen ]
# ['a', 'b', 'c', 'd', 'e', 'f']
如果您无权访问
some_function
,则可以在自己的包装函数中对其进行调用,该函数将其返回值添加到seen
集中,然后再返回。即使这不是列表理解,我还是将整个内容封装在一个函数中,以使重用变得更容易:
def some_function(s):
# do something with or to 's'...
return s
def add_unique(function, data):
result = []
seen = set(result) # init to empty set
for s in data:
if s not in seen:
t = function(s)
result.append(t)
seen.add(t)
return result
print add_unique(some_function, raw_data)
# ['a', 'b', 'c', 'd', 'e', 'f']
无论哪种情况,我都觉得很奇怪,您要引用的伪代码中构建的列表不是由
raw_data
值的子集组成,而是对每个值调用some_function
的结果-即转换后的数据- -这自然使人怀疑some_function
会做什么,以使其返回值可能与现有raw_data
项的值匹配。关于python - 理解力: References to the Components,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5056297/