【问题标题】:list identification and sorting: integers and strings列表识别和排序:整数和字符串
【发布时间】:2014-07-28 21:32:49
【问题描述】:

我有一个列表(即 list1),其中包含一个整数,然后是一组字符串(1 到 5 个项目),然后是另一个整数和一组字符串,等等。所以列表看起来像 [1, "biology", "physics", 2, "chemistry", "history", ...]。我想循环遍历列表,识别第一个整数,将其分配给新列表(即 list2),将字符串分配给新列表(即 list3),找到下一个整数,将其分配给 list2,添加下一个字符串到 list3 等。

所以最终名单是:

list1[1, "biology", "physics", 2, "chemistry", "history"...]
list2[1,2...]
list3["biology", "physics", "chemistry", "history"...]

任何人有代码 sn-p 来有效地执行此任务?

【问题讨论】:

  • 你使用什么编程语言?
  • 你可以只创建两个空列表(list2,list3),然后遍历list1并检查元素是否为数字,附加到list2,否则附加到list3 .不知道语言,不可能说它是如何编码的。

标签: list sorting


【解决方案1】:

列表分区

这是一种在函数式编程中广泛使用的模式,称为partitioning条件列表。

您从iterable 和谓词pred 开始,您想要获得两个列表,一个用于iterable 中与谓词匹配的项目,另一个用于不匹配谓词的项目。

假设您使用的是 Python,您可以从其他项中过滤出与谓词匹配的项:

def partition(pred, iterable):
    return filter(pred, iterable), filter(lambda x: not pred(x), iterable)

如果它很大,你也可以避免迭代两次,只扫描所有项目一次并将它们附加到相应的列表中:

def partition(pred, iterable):
    match, nomatch = [], []
    for item in iterable:
        (match if pred(item) else nomatch).append(item)
    return match, nomatch

如果您使用的是 Python 3,partition 已经包含在 itertools 中,语法与上面定义的相同,因此您只需:

from itertools import partition

对于您的列表分区实例,您可以这样做:

list1 = [1, "biology", "physics", 2, "chemistry", "history"]
list2, list3 = partition(lambda obj: isinstance(obj, int), list1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多