当前位置: 首页 > 知识库问答 >
问题:

Swift中的列表理解

桓瀚
2023-03-14

语言指南没有显示出列表理解的痕迹。在SWIFT中实现这一点的最简洁的方法是什么?我在找类似于:

evens = [ x for x in range(10) if x % 2 == 0]

共有1个答案

孔君浩
2023-03-14

从Swift2.x开始,您对Python风格列表的理解有了一些简短的等价物。

对Python公式的最直接的修改(其内容类似于“将转换应用于受筛选器约束的序列”)涉及链接所有SequenceType可用的映射Filter方法,并从范围开始:

// 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 html" target="_blank">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 })

请注意,范围是抽象的--它实际上并不创建您所要求的值的整个列表,只是一个根据需要提供这些值的构造。(从这个意义上说,它更像是Python的Xrange。)但是,过滤器调用返回一个数组,因此丢失了“懒惰”方面。如果您想让收集一直保持懒惰,只需这么说:

// 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中的这些操作遵循与其他操作相同的语法。也就是说,构造、筛选和操作一系列数字的语法风格与筛选和操作一个对象数组的语法风格相同--您不必对一种工作使用函数/方法语法,而对另一种工作使用列表理解语法。

您还可以将其他函数传递给筛选器映射调用,并链接到其他方便的转换中,如sortreduce:

// 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
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不会在背景中优化理解。我错了吗?