繁体   English   中英

从 Python 中的“对”列表中获取有序整数列表

[英]Obtaining a list of ordered integers from a list of "pairs" in Python

您好,我目前正在处理大量数据,其中包含偶数个整数,所有这些都具有匹配的值。 我正在尝试创建一个由 Python 中的“一对中的一个”组成的列表。我能够拥有多个具有相同值的对,因此仅使用set函数是行不通的。 例如,如果我有一个列表:

List = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]

在这个例子中,索引01将是一对,然后是27354689

我想从该列表中提取组成每一对的值,并使用所述值创建一个新列表以生成诸如:

newList = [10, 11, 20, 15, 10]

使用 set 函数使得整个数据集中只有一个元素被放入列表中,我需要List总数据的一半。 对于我有不止一对相同值的情况,它看起来像这样:

List = [10, 10, 11, 10, 11, 10]

需要生成一个列表,例如:

newList = [10, 11, 10]

任何见解都会很棒,因为我是 Python 的新手,并且有很多我可能不知道的功能。

谢谢

你试一试:

new_list = set(list)

这应该返回您想要的输出。

如果我理解正确,您不希望有任何重复的值,希望保留一个包含特定列表中唯一值的列表。

如果我是对的,一个简单的方法是:

List = [10, 10, 11, 11, 15, 20, 15, 20]
newList = []
for x in List:
    if x not in newList:
        newList.append(x)

print(newList)

一种类似python的方法是:

newList = set(List)

这是@Alain T 答案之一的细微变化:

 [i for s in [set()] for i in List if (s.remove(i) if i in s else (not s.add(i)))] 

注意:以下是我在添加订购要求之前的回答

sorted(List)[::2]

这对输入List排序,然后从每两个连续值中取出一个值。

作为一般方法,这将执行以下操作:

l = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]
i = 0
while i < len(l):
    del l[l.index(l[i], i + 1)]
    i += 1

它逐个遍历列表,找到当前值下一次出现的索引,然后删除它,缩短列表。 这可能可以用各种方式修饰,但这是一个简单的算法。 如果数字没有匹配的对,这将引发ValueError

以下代码生成一个新列表,该列表包含输入列表中出现的项目数的一半。 顺序是输入列表中第一次出现的顺序。

>>> from collections import Counter
>>> d = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]
>>> c = Counter(d)
>>> c
Counter({10: 4, 11: 2, 20: 2, 15: 2})
>>> answer  = sum([[key] * (val // 2) for key, val in c.items()], [])
>>> answer
[10, 10, 11, 20, 15]
>>> 

如果您需要保留每对第一次出现的顺序,您可以使用一个对值进行 XOR 操作的集合,以在第一次和第二次出现之间交替。

List = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]

paired = [ i for pairs in [set()] for i in List if pairs.symmetric_difference_update({i}) or i in pairs]
print(p)
# [10, 11, 20, 15, 10]

您也可以使用 itertools 中的累积函数来执行此操作:

from itertools import accumulate
paired = [a for a,b in zip(List,accumulate(({n} for n in List),set.__xor__)) if a in b]
print(paired)
# [10, 11, 20, 15, 10]

或者使用位图而不是集合(如果您的值是相对较小的正整数(例如在 0 和 64 之间):

paired = [ n for n,m in zip(List,accumulate((1<<n for n in List),int.__xor__)) if (1<<n)&m ]
print(paired)
# [10, 11, 20, 15, 10]

或者您可以使用集合中的计数器

from collections import Counter
paired = [ i for c in [Counter(List)] for i in List if c.update({i:-1}) or c[i]&1 ]
print(paired)
# [10, 11, 20, 15, 10]

并且,如果您不太担心效率,可以使用 2 步跨步的双重排序:

paired = [List[i] for i,_ in sorted(sorted(enumerate(List),key=lambda n:n[1])[::2])]
print(paired)
# [10, 11, 20, 15, 10]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM