说我有一个清单,
list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
Run Code Online (Sandbox Code Playgroud)
而另一个,
list2 = [[True, True], [False], [True], [False]]
Run Code Online (Sandbox Code Playgroud)
(你可以想象第二个列表是用动物作为家养宠物的itertools.groupby创建的.)
现在说我想给第一个列表提供与第二个列表相同的子列表结构.
list3 = [['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]
Run Code Online (Sandbox Code Playgroud)
我可能会这样做:
list3 = []
lengths = [len(x) for x in list2]
count = 0
for leng in lengths:
templist = []
for i in range(leng):
templist.append(list1[count])
count += 1
list3.append(templist)
Run Code Online (Sandbox Code Playgroud)
我没有完全调试,但我认为应该工作.我的问题是,是否有更多的pythonic或简单的方法来做到这一点?这似乎有点令人费解,我不得不想象有一种更优雅的方式来做这件事(也许是在永远不会给我留下深刻印象的itertools).
我想知道Swift中是否有可能使类型符合协议,因此我可以将类型本身视为符合协议,就像通常将实例视为符合协议一样.示例代码:
protocol P {
func f()
}
class C where C.self: P { // Not actual code
static func f() {
print("Because C.f: ()->() exists, C.self should satisfy the protocol.")
}
}
Run Code Online (Sandbox Code Playgroud) 是否可以将macro_rules!类型的变量插入ident宏中的字符串文字中?换句话说,是否可以“转义”文字的双引号?
// `trace_macros!` requires nightly
#![feature(trace_macros)]
trace_macros!(true);
macro_rules! export_mod_if_feature {
($system:ident) => {
#[cfg(target_os = "$system")] // <-- problem is here
pub mod $system;
};
}
export_mod_if_feature!(linux);
// ... should translate to:
#[cfg(target_os = "linux")]
pub mod linux;
// ... but instead it becomes:
#[cfg(target_os = "$system")]
pub mod linux;
Run Code Online (Sandbox Code Playgroud)
我尝试过使用#[cfg(target_os = stringify!($system))],但cfg需要一个实际的字符串文字target_os =,而不仅仅是一个编译时字符串。
File "project.py", line 5, in <module>
from tkinter.filedialog import askopenfilenames
ModuleNotFoundError: No module named 'tkinter'
Run Code Online (Sandbox Code Playgroud)
当我想用诗歌运行 python project.py 运行我的项目时,这种情况总是会发生,但如果我本机运行它就可以完美地工作。所以我猜问题是将 Tkinter 添加到 .toml 文件中,但是当我将 tk 添加到依赖项时,它无法正常工作。我应该怎么办?
在我的iOS应用程序中,我有一个UITabBarController,它的viewControllers列表看起来像[vc1, vc2],它们分别是类MyVC1和MyVC2两个子类UIViewController.MyVC1覆盖viewWillAppear,覆盖的版本打印一些东西,所以我知道它什么时候被调用.(这是为了隔离我遇到的一个更大的问题,这是一个没有出现的观点.)
我的问题是,当应用程序首次启动并且vc1是选定的选项卡时,不会打印任何内容,这意味着它viewWillAppear不会被调用.如果我切换标签,然后回去vc1,东西确实得到印刷,所以vc1的viewWillAppear不被调用,直到我切换回它从另一个选项卡.
有没有办法在应用启动时立即vc1拨打电话viewWillAppear,而无需切换标签?老实说,我很惊讶这不是默认行为.
>>> a = 1
>>> print { key: locals()[key] for key in ["a"] }
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
KeyError: 'a'
Run Code Online (Sandbox Code Playgroud)
如何创建一个像这样理解的字典?
Swift GeneratorType参考说明了该next方法:
next()前进到下一个元素并返回它,如果不存在下一个元素,则返回nil.
然后在讨论中说
要求:自
next()复制完成self以来未应用于副本,并且未self.next()返回任何先前的调用nil.鼓励该协议的特定实现通过调用来响应违反此要求的行为preconditionFailure("...").
如果Generator是可选类型,那么它可以nil在到达序列结束之前达到一个值.Swift如何知道它在这种情况下还没有达到目的?
我有以下枚举:
enum JSONData {
case dict([String:Any])
case array([Any])
}
Run Code Online (Sandbox Code Playgroud)
我想使用防护用例let使用类型转换进行模式匹配分配。我不仅要确保someData是.array,而且要确保其关联的类型不是[Int],而不仅仅是[Any]。用单个表达式可以做到吗?类似于以下内容:
let someData: JSONData = someJSONData()
guard case let .array(anArray as [Int]) = someData
else { return }
Run Code Online (Sandbox Code Playgroud)
但是上面没有编译;错误是downcast pattern value of type '[Int]' cannot be used。我知道以下是可能的,但如果可能的话,我宁愿用一个表达式来完成。
guard case let .array(_anArray) = someData, let anArray = _anArray as? [Int]
else { return }
Run Code Online (Sandbox Code Playgroud)
编辑于2018年4月27日:此情况的更新:您现在可以使用以下语法,只要强制转换类型不是Collection:
enum JSONData {
case dict([String:Any])
case array(Any) // Any, not [Any]
}
func …Run Code Online (Sandbox Code Playgroud)