语言指南显示没有列表理解的痕迹。 在Swift中完成这项工作的最简洁的方法是什么? 我正在寻找类似的东西:
evens = [ x for x in range(10) if x % 2 == 0]
从Swift 2.x开始,Python样式列表理解有一些简短的等效内容。
Python公式的最直接的改编(读取类似“将转换应用于要过滤的序列”之类的东西)包括将可用于所有s
的map
和filter
方法链接起来SequenceType
,并从以下位置开始Range
:
// Python: [ x for x in range(10) if x % 2 == 0 ]
let evens = (0..<10).filter { $0 % 2 == 0 }
// Another example, since the first with 'x for x' doesn't
// use the full ability of a list comprehension:
// Python: [ x*x for x in range(10) if x % 2 == 0 ]
let evenSquared = (0..<10).filter({ $0 % 2 == 0 }).map({ $0 * $0 })
请注意,a Range
是抽象的-
它实际上不会创建您要求的值的完整列表,而只是按需延迟提供它们的构造。(从这种意义上讲,它更像是Python的xrange
。)但是,该filter
调用返回an
Array
,因此您在那里失去了“惰性”方面。如果您想让收藏一直保持懒散,请这样说:
// Python: [ x for x in range(10) if x % 2 == 0 ]
let evens = (0..<10).lazy.filter { $0 % 2 == 0 }
// Python: [ x*x for x in range(10) if x % 2 == 0 ]
let evenSquared = (0..<10).lazy.filter({ $0 % 2 == 0 }).map({ $0 * $0 })
与Python中的列表理解语法(以及某些其他语言中的类似构造)不同,Swift中的这些操作遵循与其他操作相同的语法。也就是说,构造,过滤和操作一系列数字的语法与过滤和操作对象数组的语法是同一样式-
您不必为一种工作使用函数/方法语法并列出另一个语法。
您可以将其他函数传递给filter
和map
调用,并链接其他方便的转换,例如sort
和reduce
:
// func isAwesome(person: Person) -> Bool
// let people: [Person]
let names = people.filter(isAwesome).sort(<).map({ $0.name })
let sum = (0..<10).reduce(0, combine: +)
但是,根据您要做什么,可能会有更简洁的方式表达您的意思。例如,如果您特别想要偶数列表,则可以使用stride
:
let evenStride = 0.stride(to: 10, by: 2) // or stride(through:by:), to include 10
与范围一样,它可以为您提供一个生成器,因此您需要从中生成一个Array
或对其进行遍历以查看所有值:
let evensArray = Array(evenStride) // [0, 2, 4, 6, 8]
编辑: 对Swift 2.x进行了重大修订。如果需要Swift 1.x,请参阅编辑历史记录。
语言指南没有显示出列表理解的痕迹。在SWIFT中实现这一点的最简洁的方法是什么?我在找类似于:
在第一个中,我有“alreadyloaded”用户ID, 在第二个中,我有所有的用户ID, 如何在FireStore中将第一个元素从第二个元素中排除?
问题内容: 加入列表: join 必须采取迭代。 显然,join的论点是,这是一个列表理解。 看这个: 现在,join的参数为,但结果相同。 为什么?是否str还会产生列表或可迭代项? 问题答案: 这称为生成器表达式,并在PEP 289中进行了说明。 生成器表达式和列表理解之间的主要区别在于前者不在内存中创建列表。 请注意,还有第三种编写表达式的方法:
问题内容: 如何在Python中执行以下操作? 实质上: 用空字符串替换所有的None,然后 执行功能。 问题答案: 你可以完全做到这一点,这只是一个订购问题: 一般来说, 而且,if仅对于具有条件的列表理解而言, 请注意,这实际上使用了一种不同的语言构造,即条件表达式,它本身不是理解语法的一部分,而ifafter则for…in是列表理解的一部分,用于从可迭代的源中筛选元素。 条件表达式可用于各种
问题内容: 是否可以在Python中定义递归列表理解? 可能是一个简单的示例,但类似于: 这样有可能吗? 问题答案: 不,没有(记录,可靠,稳定,… ;-)引用“当前理解”的方法。您可以只使用一个循环: 当然,这是非常昂贵的(O(N平方)),因此您可以使用辅助工具对其进行优化(我假设将项目的顺序与中的项目顺序保持一致,否则可以做到;-)。 ..: 对于非常长的列表(O(N)而不是N平方),这要快得
我一直在学习Haskell,我做了一些统计函数,这些函数可以用于或类型的列表 以下是两个示例: 然而,我现在想知道我是否可以通过以不同的方式编写来改进运行时。像这样: 或者像这样: 我不知道哈斯克尔在屏幕后面是怎么处理的。在原始版本中,计算机是否为中的每个条目计算?我想Haskell不会在背景中优化理解。我错了吗?