请与lambdas一起说明python周期

时间:2019-08-13 18:30:38

标签: python lambda xlsx cycle

我需要根据自己的需要编辑代码,但是很遗憾,我没有选择从零重写,所以我必须了解这是什么,因为截止日期为11小时。阻止大三找到工作

    if text and segment:
        if "Office" in segment:
            if True in list(map(lambda x: x in text, _classes[_classB][0])):
                return "Класс Б"
        if "Warehouse" in segment:
            if True in list(map(lambda x: x in text, _classes[_classB][0])) or \
                    True in list(map(lambda x: x in text and True in [w not in text for w in _classes[_classA][0]], 
                        _classes[_classB][1])):

                return "Class B"    
        return ""
    return ""

请您说明到底是什么

 True in list(map(lambda x: x in text and True in [w not in text for w in _classes[_classA][0]],_classes[_classB][1])):

还是“ unlambda”之类的东西?非常感谢

UPD:我需要添加一条规则:“如果土地面积> 9000,则...”,其中另一列的土地面积”

3 个答案:

答案 0 :(得分:5)

好的,所以首先让我们重新格式化它以获得更好的观点:

True in list(map(
    lambda x: (
        x in text 
        and True in [
            w not in text
            for w in _classes[_classA][0]
        ],
    _classes[_classB][1]
))

它看起来仍然很疯狂,但是幸运的是我们可以进一步简化:

  • innot in将给出TrueFalse,但是我们可以不用True in ...,而可以any(...)
  • 内部列表理解[...]独立于外部地图,因此我们可以对其进行重构,
  • 由于x in text和随后的w条件已进行and,因此我们可以将前面的w条件拉到快捷方式以防{{1} }

因此我们获得:

False

基本上,这似乎可以检查w_condition = any(w not in text for w in _classes[_classA][0]) result = w_condition and any(x in text for x in _classes[_classB][1]) 是否包含text的全部和至少_classes[_classA][0]中的一个。为什么这样做取决于您的判断。

答案 1 :(得分:3)

 True in list(map(lambda x: x in text and True in [w not in text for w in _classes[_classA][0]],_classes[_classB][1])):

这绝对是一场噩梦,所以让我们分解一下。

True in list(map(...))

map()函数将基于某些转换函数和输入返回对象的映射。 list()会将其转换为列表。

lambda x: x in text and True in [w not in text for w in _classes[_classA][0]],_classes[_classB][1]

我们可以取出lambda并将其转换为函数:

# globals variables to make our lives easier. Bad practice but obviously they don't
# care about that.
text = ...
_classes = ...

def mylambda(x):
  """
  Checks that x exists in text and some class doesn't appear in text.
  """
  classA0 = _classes[_classA][0]
  classInText= w not in text for w in classA0
  return x in text and True in classInText

现在,我们可以简化它:

list(map(mylambda, _classes[_classB][1])):

此语句将返回布尔值列表。

True in list(map(mylambda, _classes[_classB][1])):

如果对于_classes[_classB][1]中的任何值,该值存在于text中,而_classes[_classA][0]中的某个值在text中不存在,则返回True。 / p>

现在结束了,请刻录此代码,不再赘述。

答案 2 :(得分:0)

以下行:

True in list(map(lambda x: x in text and True in [w not in text for w in _classes[_classA][0]],_classes[_classB][1])):
  # do smth

可以改写为:

array2 = []
for x in _classes[_classB][1]:
  array1 = []
  for w in _classes[_classA][0]:
    if w not in text:
      array1.append(True)
    else
      array1.append(False)
  if x in text and True in array1:
    array2.append(True)
  else:
    array2.append(False)
if True in array2:
  # do smth

可以变成:

condition1Met = False
for x in _classes[_classB][1]:
  condition2Met = False
  for w in _classes[_classA][0]:
    if w not in text:
      condition2Met = True
      break
  if x in text and condition2Met:
    condition1Met = True
    break
if condition1Met:
  # do smth

由于我不了解您的情况,因此我不可能更好地命名变量,但我希望这更易于管理。