我正在开发一个邮资申请,需要根据多个邮政编码范围检查整数邮政编码,并根据邮政编码匹配的范围返回不同的代码.
每个代码都有多个邮政编码范围.例如,如果邮政编码在1000-2429,2545-2575,2640-2686范围内或等于2890,则应返回M代码.
我可以这样写:
if 1000 <= postcode <= 2429 or 2545 <= postcode <= 2575 or 2640 <= postcode <= 2686 or postcode == 2890:
return 'M'
Run Code Online (Sandbox Code Playgroud)
但这似乎是很多代码行,因为有27个可返回代码和77个总范围要检查.是否有更高效(并且最好更简洁)的方法使用Python将整数与所有这些范围匹配?
编辑:有很多优秀的解决方案,所以我已经实现了所有可能的解决方案,并对其性能进行了基准测试.
该程序的环境是一个Web服务(实际上是Django),它需要在运行中逐个检查邮政编码区域代码.那么,我的首选实现是可以快速用于每个请求的实现,并且不需要将任何进程保存在内存中,或者需要批量处理许多邮政编码.
我timeit.Timer使用随机生成的邮政编码每次使用默认的1000000次重复测试以下解决方案.
if 1000 <= postcode <= 2249 or 2555 <= postcode <= 2574 or ...:
return 'M'
if 2250 <= postcode <= 2265 or ...:
return 'N'
...
Run Code Online (Sandbox Code Playgroud)
1m代表的时间:5.11秒.
我脑子里更优雅,更容易进入和阅读范围.如果它们随时间变化特别好,这是可能的.但它的实施速度确实慢了四倍.
if any(lower <= postcode <= upper for (lower, upper) in [(1000, 2249), (2555, …Run Code Online (Sandbox Code Playgroud) 在使用之前已经提出并回答了这个问题NSSortDescriptor.但是有没有使用Swift标准的方式Array.sort()?
struct Sortable {
let isPriority: Bool
let ordering: Int
}
Run Code Online (Sandbox Code Playgroud)
Sortables按一个属性排序数组很简单:
sort { $0.ordering < $1.ordering }
Run Code Online (Sandbox Code Playgroud)
但是我想在isPriority那时候排序ordering- 我无法理解一个简单的陈述来实现这一目标.
我使用django-rest-framework带django-filter.我需要检索date属性所在的小部件列表None,但无论我尝试了什么查询,我都会得到空的响应或完整的,未经过滤的响应.
这是我如何定义视图集和filterset.
class WidgetFilter(django_filters.FilterSet):
date = django_filters.DateTimeFilter(name='date', lookup_type='exact')
no_date = django_filters.DateTimefilter(name='date', lookup_type='isnull')
class Meta:
model = Widget
fields = ['date',]
class WidgetSet(viewsets.ModelViewSet):
model = Widget
filter_class = WidgetFilter
Run Code Online (Sandbox Code Playgroud)
以下查询会导致空[]响应:
?date=None
?date=0
?date=NULL
?date=False
?date=2012-05-24T11:20:06Z # a known and correct date
Run Code Online (Sandbox Code Playgroud)
以下查询导致返回所有对象:
?date=
?no_date=True
?no_date=False
?no_date=1
?no_date=0
Run Code Online (Sandbox Code Playgroud)
很感谢任何形式的帮助!我一直无法找到使用日期(或传递任何信息None作为过滤器值)django-filter专门通过django-rest-framework.
如果没有更优雅的方式,这就是我提出的解决方法,但我仍然想知道一个使用的解决方案django-filter,如果存在的话.
class WidgetSet(viewsets.ModelViewSet):
model = Widget
def get_queryset(self):
if 'no_date' in self.request.QUERY_PARAMS:
return self.model.objects.filter(date=None)
return …Run Code Online (Sandbox Code Playgroud) 我试图将ObjC stackoverflow答案转换为Swift并失败.看起来我正在通过一个UnsafeMutablePointer<mach_msg_type_number_t>我应该通过的时候inout mach_msg_type_number_t,我似乎无法解决我的问题.根据我对Swift指针文档的理解(不多),这些应该是可以互换的.
更多信息如下.
这是目标C:
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
Run Code Online (Sandbox Code Playgroud)
就我在Swift中所获得的而言(许多行更容易进行类型检查)
let name: task_name_t = mach_task_self_
let flavor: task_flavor_t = task_flavor_t(MACH_TASK_BASIC_INFO)
var info: mach_task_basic_info
var size: mach_msg_type_number_t = UnsignedFixed(sizeof(mach_task_basic_info_t))
let kerr = task_info(name, flavor, info as task_info_t, &size)
Run Code Online (Sandbox Code Playgroud)
该task_info签名是:
func task_info(target_task: task_name_t, flavor: task_flavor_t, task_info_out: task_info_t, task_info_outCnt: UnsafeMutablePointer<mach_msg_type_number_t>) -> kern_return_t
Run Code Online (Sandbox Code Playgroud)
并且最后一行的错误是:
Cannot convert the expression's type '(@!lvalue task_name_t, task_flavor_t, task_info_t, inout mach_msg_type_number_t)' to type 'kern_return_t'
Run Code Online (Sandbox Code Playgroud) 所以我在视图控制器中有一个附加Pan和Magnify手势识别器的视图.
当我使用Show,Modal或Presentation segues呈现视图控制器时,两个手势识别器都能正常工作.但是当我将它作为工作表呈现时,只有泛识别器响应输入.Magnify识别器根本不会发射.
这里的示例项目.使用第一个窗口中的按钮以不同方法显示视图控制器,并在呈现视图中的任何位置显示手势.指示器将显示已识别的手势.
例外情况是"NSWindow:-_oldFirstResponderBeforeBecoming不是响应者执行-becomeFirstResponder之外的有效消息." 然而,根据堆栈跟踪信息是从所谓的becomeFirstResponder,所以我不知道我做错了.这是间歇性错误.
用户按下键命令序列,该键命令序列触发菜单项,该菜单项向键窗口控制器发送消息,该键控窗口控制器告知窗口上的搜索字段成为第一响应者.
这是一个汇总的堆栈跟踪::
[NSException raise:format:]
[NSWindow _oldFirstResponderBeforeBecoming]
[NSSearchField becomeFirstResponder]
[MyWindowController focusSearchField]
[NSApplication sendAction:to:from:]
[NSMenu performKeyEquivalent:]
Run Code Online (Sandbox Code Playgroud)
窗口控制器的动作实现非常简单:
public var searchField: NSSearchField?
@IBAction public func focusSearchField(sender: AnyObject) {
searchField?.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我试图在Swift中为一个简单的命令行批处理脚本同步读取URL的内容.为简单起见,我使用cURL - 我知道如果必须的话,我可以使用NSURLSession.我也在swift buildOSX上使用Swift的开源版本来构建它.
问题是在某些URL上,如果stdout已重定向到管道,则NSTask永远不会终止.
// This will hang, and when terminated with Ctrl-C reports "(23) Failed writing body"
import Foundation
let task = NSTask()
let pipe = NSPipe()
task.launchPath = "/usr/bin/curl"
task.arguments = ["http://trove.nla.gov.au/newspaper/page/21704647"]
task.standardOutput = pipe
task.launch()
task.waitUntilExit()
Run Code Online (Sandbox Code Playgroud)
但是,如果删除管道或更改URL,则任务成功.
// This will succeed - no pipe
import Foundation
let task = NSTask()
task.launchPath = "/usr/bin/curl"
task.arguments = ["http://trove.nla.gov.au/newspaper/page/21704647"]
task.launch()
task.waitUntilExit()
// This will succeed - different URL
import Foundation
let task = NSTask()
let pipe = …Run Code Online (Sandbox Code Playgroud) 我确信我错过了一些非常非常明显的事情,但是有人能告诉我为什么我遇到麻烦的两倍Integers吗?以下代码:
let twenty: Integer = 20
let ten: Integer = 10
let result: Integer = twenty * ten
Run Code Online (Sandbox Code Playgroud)
出现错误Could not find an overload for '*' that accepts the supplied arguments.
关于具有相同错误的SO的其他问题是由于尝试将不同类型相乘而引起的,但这些都是Integer类型吗?
(PS:我试图运行的实际代码是,var value = self.value * 10但是我在调试时已将其扩展为示例,以确保正确使用正确的类型)