在 Python 列表上进行排序和 uniq 的最简洁方法是什么?

发布于 2024-09-04 02:58:44 字数 456 浏览 4 评论 0原文

考虑一个包含 ['foo', 'foo', 'bar'] 的 Python 列表 my_list

统一并对列表进行排序的最 Pythonic 方法是什么?
(想想cat my_list | sort | uniq

这就是我目前的做法,虽然它有效,但我确信有更好的方法可以做到这一点。

my_list = []
...
my_list.append("foo")
my_list.append("foo")
my_list.append("bar")
...
my_list = set(my_list)
my_list = list(my_list)
my_list.sort()

Consider a Python list my_list containing ['foo', 'foo', 'bar'].

What is the most Pythonic way to uniquify and sort a list ?
(think cat my_list | sort | uniq)

This is how I currently do it and while it works I'm sure there are better ways to do it.

my_list = []
...
my_list.append("foo")
my_list.append("foo")
my_list.append("bar")
...
my_list = set(my_list)
my_list = list(my_list)
my_list.sort()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

往日情怀 2024-09-11 02:58:44
my_list = sorted(set(my_list))
my_list = sorted(set(my_list))
莫多说 2024-09-11 02:58:44
# Python ≥ 2.4
# because of (generator expression) and itertools.groupby, sorted

import itertools

def sort_uniq(sequence):
    return (x[0] for x in itertools.groupby(sorted(sequence)))

更快:

import itertools, operator
import sys

if sys.hexversion < 0x03000000:
    mapper= itertools.imap # 2.4 ≤ Python < 3
else:
    mapper= map # Python ≥ 3

def sort_uniq(sequence):
    return mapper(
        operator.itemgetter(0),
        itertools.groupby(sorted(sequence)))

两个版本都返回一个生成器,因此您可能希望将结果提供给列表类型:

sequence= list(sort_uniq(sequence))

请注意,这也适用于不可散列的项目:

>>> list(sort_uniq([[0],[1],[0]]))
[[0], [1]]
# Python ≥ 2.4
# because of (generator expression) and itertools.groupby, sorted

import itertools

def sort_uniq(sequence):
    return (x[0] for x in itertools.groupby(sorted(sequence)))

Faster:

import itertools, operator
import sys

if sys.hexversion < 0x03000000:
    mapper= itertools.imap # 2.4 ≤ Python < 3
else:
    mapper= map # Python ≥ 3

def sort_uniq(sequence):
    return mapper(
        operator.itemgetter(0),
        itertools.groupby(sorted(sequence)))

Both versions return an generator, so you might want to supply the result to the list type:

sequence= list(sort_uniq(sequence))

Note that this will work with non-hashable items too:

>>> list(sort_uniq([[0],[1],[0]]))
[[0], [1]]
只怪假的太真实 2024-09-11 02:58:44

Ignacio 提供了简单的解决方案 - sorted(set(foo))

如果您有唯一的数据,那么您很有可能不仅仅想要执行 sorted(set(...)) ,而是始终存储一组数据并偶尔提取排序版本的价值观。 (从那时起,它开始听起来像是人们经常使用数据库做的事情。)

如果您有一个排序列表,并且您想检查对数成员资格并在最坏情况线性时间内添加一个项目,您可以使用bisect 模块

如果你想一直保持这种情况,并且你想简化事情或让某些操作执行得更好,你可以考虑 blist.sortedset

The straightforward solution is provided by Ignacio—sorted(set(foo)).

If you have unique data, there's a reasonable chance you don't just want to do sorted(set(...)) but rather to store a set all the time and occasionally pull out a sorted version of the values. (At that point, it starts sounding like the sort of thing people often use a database for, too.)

If you have a sorted list and you want to check membership on logarithmic and add an item in worst case linear time, you can use the bisect module.

If you want to keep this condition all the time and you want to simplify things or make some operations perform better, you might consider blist.sortedset.

一瞬间的火花 2024-09-11 02:58:44

其他人提到了sorted(set(my_list)),它适用于可哈希值,例如字符串、数字和元组,但不适用于不可哈希类型,例如列表。

要获取任何可排序类型的值的排序列表,没有重复:

from itertools import izip, islice
def unique_sorted(values):
    "Return a sorted list of the given values, without duplicates."
    values = sorted(values)
    if not values:
        return []
    consecutive_pairs = izip(values, islice(values, 1, len(values)))
    result = [a for (a, b) in consecutive_pairs if a != b]
    result.append(values[-1])
    return result

这可以使用 itertools 文档

Others have mentioned sorted(set(my_list)), which works for hashable values such as strings, numbers and tuples, but not for unhashable types such as lists.

To get a sorted list of values of any sortable type, without duplicates:

from itertools import izip, islice
def unique_sorted(values):
    "Return a sorted list of the given values, without duplicates."
    values = sorted(values)
    if not values:
        return []
    consecutive_pairs = izip(values, islice(values, 1, len(values)))
    result = [a for (a, b) in consecutive_pairs if a != b]
    result.append(values[-1])
    return result

This can be further simplified using the "pairwise" or "unique_justseen" recipes from the itertools documentation.

月亮邮递员 2024-09-11 02:58:44

不能说这是一种干净的方法,但只是为了好玩:

my_list = [x for x in sorted(my_list) if not x in locals()["_[1]"]]

Can't say it is clean way to do that, but just for fun:

my_list = [x for x in sorted(my_list) if not x in locals()["_[1]"]]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文