【问题标题】:Python equivalent of Ruby's .findPython 相当于 Ruby 的 .find
【发布时间】:2019-07-04 18:22:36
【问题描述】:

我正在尝试将以下 Ruby 方法实现为 Python 方法:

CF = {:metre=>{:kilometre=>0.001, :metre=>1.0, :centimetre=>100.0}, :litre=>{:litre=>1.0, :millilitre=>1000.0, :imperial_pint=>1.75975}}

def common_dimension(from, to)
  CF.keys.find do |canonical_unit|
    CF[canonical_unit].keys.include?(from) &&
    CF[canonical_unit].keys.include?(to)
  end
end

表现如下:

>> common_dimension(:metre, :centimetre)
=> :metre

>> common_dimension(:litre, :centimetre)
=> nil

>> common_dimension(:millilitre, :imperial_pint)
=> :litre

实现这一点的“Pythonic”方式是什么?

【问题讨论】:

  • 检查哈希 Ruby 中是否存在密钥时的快速提示。请改用#key?#has_key?。由于它使用键查找而不是循环遍历所有键来测试其中一个键是否等于给定键,因此它更短更快。

标签: python ruby language-comparisons


【解决方案1】:

下面的 python 代码用于您的 ruby​​ 逻辑。

CF={"metre":{"kilometre":0.001, "metre":1.0, "centimetre":100.0}, "litre":{"litre":1.0, "millilitre":1000.0, "imperial_pint":1.75975}}

def common(fr,to):
    for key,value in CF.items():
        if (fr in value) and (to in value):
            return key   

print(common('metre','centimdetre'))
metre
print(com('metre','centimdetre'))
None
******************

single line function 
com = lambda x,y:[key for key,value in CF.items() if (x in value) and (y in value)]
print(com('metre','centimdetre'))
['metre']

【讨论】:

    【解决方案2】:

    Ruby 和 Python 的其他选项。

    对于红宝石:

    cf = {:metre=>{:kilometre=>0.001, :metre=>1.0, :centimetre=>100.0}, :litre=>{:litre=>1.0, :millilitre=>1000.0, :imperial_pint=>1.75975}}
    
    from = :litre
    to = :millilitre
    cf.select { |k, v| ([from, to] - v.keys).empty? }.keys
    #=> [:litre]
    

    对于 Python:

    CF = {'metre': {'kilometre': 0.001, 'metre': 1.0, 'centimetre': 100.0}, 'litre': {'litre': 1.0, 'millilitre': 1000.0, 'imperial_pint': 1.75975}}
    
    _from = 'millilitre'
    _to = 'imperial_pint'
    res = [ k for k, v in CF.items() if not bool(set([_from, _to]) - set(v.keys())) ]
    #=> ['litre']
    

    【讨论】:

    • 嗨 iGian,我很惊讶你也知道 Python。我可以知道您认为哪种语言更容易吗?还是更容易使用?
    • @Rajagopalan 话题太宽泛了! :) 很难说。我不是专业人士,只是在学习中获得乐趣。它们是相似的。我更喜欢 Ruby 语法。 Python 具有强大的库,请参阅 SciPy。我建议:自己尝试一下。
    猜你喜欢
    • 2014-05-25
    • 2020-02-16
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多