【问题标题】:Sort list based on pattern基于模式的排序列表
【发布时间】:2016-06-13 15:50:25
【问题描述】:

我想知道如何根据其他两个列表的值/顺序轻松生成列表:

list_a = ['web1','web2','web3','web1','web4']
list_b = ['web2','web4','web1','web5','web1']

我想从“list_a”中检索按值排序的“list_b”列表:

final = ['web1','web2','web1','web4','web5']

如果一个条目存在于 list_b 但不存在于 list_a,则该值将附加到列表的末尾。

我不确定从哪里开始,我最初的想法是使用枚举[i for i, x in enumerate(mylist) if x==value] 检索所有索引,然后对列表进行排序,但是我很难管理具有倍数索引的条目(例如:web1)。只是想知道你们是否正在考虑一种简单的方法来实现这一目标?

【问题讨论】:

  • "我想从 "list_a" 中检索按值排序的 "list_b" 列表:" - 您能提供更多信息吗?
  • 我不明白你的排序机制——你如何确定哪个值在哪里?
  • 只需遍历list_a,询问list_b中list_a中的元素是否存在,继续将其添加到第三个list final中,同时从list_b中删除匹配的项目。然后在final的末尾追加list_b的剩余内容?通过对列表进行排序,您将获得什么?

标签: python list


【解决方案1】:

一个非常简单的方法是遍历list_a,如果你找到list_b 中的每个元素,你将其删除并将其附加到一个列表中。然后在迭代 list_b 中剩余的所有内容之后,您需要添加到列表末尾的元素。

list_a = ['web1','web2','web3','web1','web4']
list_b = ['web2','web4','web1','web5','web1']

front = []
for ele in list_a:
    if ele in list_b:
        front.append(ele)
        list_b.remove(ele)

final = front + list_b
print(final)

输出

['web1', 'web2', 'web1', 'web4', 'web5']

另一种更棘手的方法是使用collections.Counter 和一些列表推导,利用设置的交集和计数器的差异。

from collections import Counter

cnt_a, cnt_b = Counter(list_a), Counter(list_b)
intersct = (cnt_a & cnt_b)
diff = (cnt_b - cnt_a)

final = [a for a in list_a if a in intersct] + [b for b in list_b if b in diff]

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2011-03-29
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多