使用Python字典时,我通常使用以下习语:
try:
val = dct[key]
except KeyError:
print key, " is not valid"
Run Code Online (Sandbox Code Playgroud)
因为对于大型词典而言
if key in dct:
# do something
Run Code Online (Sandbox Code Playgroud)
效率不高(所以我记得读书,但我在实践中也注意到了)
今天我正在使用defaultdict,有一会儿我忘记了defaultdict永远不会给你一个KeyError,而是会更新原始字典.
如何在不更新defaultdict的情况下执行查找?我真的需要打印一个错误,以便用户可以重新输入密钥.
谢谢!
更新:几张海报表明我的信念if key in dct:很慢是错误的.我回去检查了我读过的最好用的书try: except:.它是2002年的Python Cookbook,Alex Martelli的Recipe 1.4,也可以在这里找到:在词典中添加一个条目.旧的记忆是如此不可靠!配方中没有提到"慢",它甚至没有使用in,但has_key.它只是说它try: except:更像Pythonic(至少是配方的书籍版本).感谢您的纠正和答案.
当我在SICP中遇到以下'替代'定义的缺点和汽车时,我才开始觉得我对球拍和方案中lambda的使用有一个模糊的理解
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法解析它们.
任何人都能解释如何以对全新手有意义的方式解析或扩展这些吗?
这是我的任务
背包问题是计算机科学的经典之作.在其最简单的形式中,它涉及尝试将不同重量的物品装入背包中,以使背包最终具有指定的总重量.您不需要适合所有项目.例如,假设您希望您的背包重量恰好为20磅,并且您有五件物品,重量为11,8,7,6和5磅.对于少量物品,人类通过检查很好地解决了这个问题.所以你可能会发现,只有8,7和5种项目的组合总计达20个.
我真的不知道从哪里开始编写这个算法.应用于阶乘和三角数时,我理解递归.但是我现在迷路了.
在Python2中,我可以使用
def subsets(mySet):
return reduce(lambda z, x: z + [y + [x] for y in z], mySet, [[]])
Run Code Online (Sandbox Code Playgroud)
找到的所有子集mySet.Python 3已删除reduce.
对Python3来说,同样简洁的重写是什么?
我觉得我错过了一些东西,但是在仔细阅读了net/url的文档并且一般地进行了探讨后,我无法找到从交互式提示中发出GET请求的方法.基本上,我想模仿我的python工作流来寻找一个网站:
response = urlopen("http://www.someurl.com")
Run Code Online (Sandbox Code Playgroud)
在Racket中这是可行的吗?
作为最近的工作申请的一部分,我被要求为这个问题编写解决方案.
鉴于,
每个人都有一个唯一的(递增的)id.从第一个人(最低身份证)开始,他们从1到k开始计数.
然后移除k处的人并且圆圈闭合.下一个剩余的人(在被淘汰的人之后)恢复计数为1.这个过程重复,直到只剩下一个人为胜者.
解决方案必须提供:
性能限制:
我记得多年前在我的CS课程中做过类似的事情,但在这次测试时无法回想起细节.我现在意识到这是一个众所周知的经典问题,有多种解决方案.(我不会提到它的名字,因为有些人可能只是'维基百科'的答案).
我已经提交了我的解决方案,所以我绝对不会找人帮我回答.如果其他人提供了一些答案,我会稍后提供一次.
我提出这个问题的主要目的是看看我的解决方案在满足要求和约束条件下与其他解决方案的比较.
(请仔细注意要求,因为我认为它们可能会使某些"经典"解决方案失效.)
我的Clojure代码有一些java-interop,它有一个抛出多个异常的方法.我希望与他们中的每个人打交道.根据Clojure文档:
(try expr* catch-clause* finally-clause?)
catch-clause -> (catch classname name expr*)
Run Code Online (Sandbox Code Playgroud)
它没有提到捕捉多个例外.是否有可能在Clojure中这样做?
谢谢!
LinkedHashMap是LIFO还是FIFO的性质?如果我的地图是形式 - >
map.put(1,"one");
map.put(2,"two");
Run Code Online (Sandbox Code Playgroud)
如果我要使用keyset在地图上迭代,那将是什么命令?
编辑:我认为我确实混淆了两个不同的概念.我重新解释了这个问题.我使用entryset遇到数量的顺序是什么?感谢指出btw.i donot打算删除任何条目.
我正在尝试使用Robolectric进行单元测试; 它们在Android Studio下运行正常,但在命令行中运行时完全相同的测试失败 - 这是一个大问题,我需要能够从我的持续集成平台运行它们,而不仅仅是从IDE运行它们.
我怀疑我缺少一些命令行参数(例如,类路径或类似的东西)或调用错误的任务 - 否则测试将无法从Android Studio运行.一些相关细节; 测试看起来像这样:
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "app/src/main/AndroidManifest.xml", resourceDir = "res", emulateSdk = 19)
public class SplashActivityTest {
@Test
public void testActivity() {
SplashActivity splashActivity = new SplashActivity();
String appName = splashActivity.getString(R.string.app_name); // HERE, line 20
assertEquals(appName, "App");
}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,它在Android Studio中正常运行(通过右键单击测试文件并选择Run 'SplashActivityTest'),但是当从命令行运行它时,它在标记为的行中失败HERE,具有以下堆栈跟踪:
android.content.res.Resources$NotFoundException: unknown resource 2131492893
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:309)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69)
at android.content.res.AssetManager.getResourceText(AssetManager.java)
at android.content.res.Resources.getText(Resources.java:240)
at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:361)
at android.content.res.Resources.getText(Resources.java)
at android.content.res.Resources.getString(Resources.java:330)
at org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:39)
at org.robolectric.shadows.ShadowContextWrapper.getString(ShadowContextWrapper.java:69)
at android.content.Context.getString(Context.java)
at path.to.myApp.activities.SplashActivityTest.testActivity(SplashActivityTest.java:20)
// …Run Code Online (Sandbox Code Playgroud) 我有一个疑问如下.
public static void main(String[] args) throws IOException{
int number=1;
System.out.println("M"+number+1);
}
Run Code Online (Sandbox Code Playgroud)
输出: M11
但我想把它打印成M2而不是M11.我无法对++进行编号,因为变量与for循环有关,如果我这样做会给我不同的结果,并且无法使用另一个print语句打印它,因为输出格式会发生变化.
请求您帮我正确打印.