【问题标题】:Converting Ruby to Python将 Ruby 转换为 Python
【发布时间】:2016-04-27 06:18:10
【问题描述】:

我正在尝试将我的 ruby​​ 脚本转换为 python。我对 python 不是很熟悉,所以我得到了一个TypeError

打印机.rb

Lease = Struct.new(:property, :renter)
lease_list = []

File.open('input.txt').readlines.each do |line|
  p, r = line.split(' - ')
  lease_list << Lease.new(p.tr('#', ''), r)
end

# sort by decimal value
lease_list.sort_by { |m| m.property.scan(/\d+/)[0].to_i }.each do |lease|
  puts "\##{lease.property} - #{lease.renter}"
end

printer.py

import re

class Lease:
  def __init__(self, renter=None, unit=None):
    self.renter = renter
    self.property = unit

lease_list = []
import sys
lines = open('input.txt', 'r')
for line in lines:
    l, m = line.split(' - ')
    lease_list.append(Lease(l,m))
lines.close()

print lease_list.sort(key=lambda lease: re.split(r"\d+", lease.property))

python 错误

Traceback (most recent call last):   File "printer.py", line 16, in
<module>
    print lease_list.sort(key=lambda str: re.split(r"\d+", str))   File "printer.py", line 16, in <lambda>
    print lease_list.sort(key=lambda str: re.split(r"\d+", str))   File
"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py",
line 171, in split
    return _compile(pattern, flags).split(string, maxsplit) TypeError: expected string or buffer

【问题讨论】:

  • 这不是语法错误,而是TypeError。语法错误显示为SyntaxError。是的,有很大的不同。
  • @AvinashRaj 在排序中,我试图找到单位属性的十进制值并按此排序
  • 将最后一行的lease.unit 替换为lease.property
  • 既然你已经修改了代码,这个错误就没有意义了

标签: python ruby regex


【解决方案1】:

问题出在这里:

print lease_list.sort(key=lambda str: re.split(r"\d+", str))

str 名称 [编辑:请参阅问题编辑历史记录]通常不应将其用作名称,即使作为一次性物品)已分配值包含在您的列表中并因此传递给re.split() Lease 类型的对象

lease_list.append(Lease(l,m))

这不被接受为re.split 的参数,它喜欢咀嚼strs。因此 TypeErrorLease 有两个属性是strs 在line.split(' - ') 之后:

self.renter = renter
self.property = unit

re.split() 中使用其中之一(以您的用例所需的为准):

print lease_list.sort(key=lambda obj: re.split(r"\d+", obj.renter))

或:

print lease_list.sort(key=lambda obj: re.split(r"\d+", obj.property))

忘了提一下,用list.sortlist 进行排序将返回None,因为它就地对列表进行了排序,在这里打印值没有用。

【讨论】:

  • 打印出None
  • 啊,是的,sort 排序就地,返回None。不过,您传入的列表已排序。
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2011-04-18
  • 2013-07-08
相关资源
最近更新 更多