Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中从列表中删除一些重复项_Python - Fatal编程技术网

在python中从列表中删除一些重复项

在python中从列表中删除一些重复项,python,Python,更新:我相信我找到了解决办法。我已经把它放在最后了 假设我们有以下列表: a = ['a', 'a', 'b', 'b', 'a', 'a', 'c', 'c'] 我想创建另一个列表来删除列表a中的重复项,但同时保持比例大致不变并保持顺序。 输出应为: b = ['a', 'b', 'a', 'c'] 编辑:为了更好地解释,比率不需要完全保持不变。所需的只是为数据中的所有字母输出一个字母。然而,两个字母可能是相同的,但代表两个不同的东西。正如我稍后所说,计数对于确定这一点很重要。代表一个唯一

更新:我相信我找到了解决办法。我已经把它放在最后了

假设我们有以下列表:

a = ['a', 'a', 'b', 'b', 'a', 'a', 'c', 'c']
我想创建另一个列表来删除列表a中的重复项,但同时保持比例大致不变并保持顺序。 输出应为:

b = ['a', 'b', 'a', 'c']
编辑:为了更好地解释,比率不需要完全保持不变。所需的只是为数据中的所有字母输出一个字母。然而,两个字母可能是相同的,但代表两个不同的东西。正如我稍后所说,计数对于确定这一点很重要。代表一个唯一变量的字母出现在3000-3400之间的计数中,因此当我将总计数除以3500并对其进行四舍五入时,我知道它最终应该出现多少次,但问题是我不知道它们的顺序

为了说明这一点,我将再提供一个输入和期望的输出:

输入:['a','a','a','b','b','c','c','a','a','d','d','a','a'] 所需输出:['a','a','b','c','a','d','a'] 请注意,“C”已重复三次。这个比率不需要精确地保留,我只需要表示这个变量被表示了多少次,因为在这个例子中它只被表示了3次,所以它不足以算作两次。 唯一的区别是,这里我假设所有重复两次的字母都是唯一的,尽管在数据集中,唯一性同样取决于3000-3400次的外观

注1:这不一定需要考虑,但有一种可能性,即并非所有字母都能很好地组合在一起,例如,考虑4个字母的唯一性以使其简短:['a'、'a'、'b'、'b'、'b'、'b']仍应表示为['a'、'b']。然而,在这种情况下,这是一个小问题

编辑: 我尝试并成功完成的示例:

完整列表=['a'、'a'、'b'、'b'、'a'、'a'、'c'、'c'] full_list是一个包含大约10k个项目的列表,仅以此为例 rep=2唯一项目的估计重复次数, 在实际列表中,该值设置为3500 quant={'a':0,b:0,c:0,d:0,e:0,f:0,g:0} 对于setfull_列表中的x: quant[x]=完整的\u list.countx/rep 最终=[] 对于范围完整列表中的x: 如果最终版本中的完整列表[x]: lastindex=lenfull_list-1-full_list[::-1].indexfull_list[x] 如果lastindex==x且final.countfull_list[x] 如果相同数据重复次数超过2次,则无法正确计数。例如:['a'、'a'、'b'、'a'、'a'、'c'、'a'、'a'、'b'、'c'、'a']应该变成['a'、'b'、'c'、'a'],但它却变成了['a'、'b'、'c'、'a'] 完成这项工作需要很长的时间,因为我相信这是一项非常艰巨的任务 这样做效率低下。 最后一句话:我尝试的代码更多的是为了在最常见的输入上实现所需的输出而进行的一点修改,但是它并没有完全达到我想要的效果。还需要注意的是,输入会随着时间的推移而变化。单个字母的重复并不总是相同的,尽管我相信它们总是组合在一起,所以我想做一个标记,当它碰到一个字母时为真,当它变为另一个字母时为假,但这也有一个问题,那就是无法解释两个相同的字母可能会放在一起的事实。作为一个个体,每个字母的计数总是在3000-3400之间,因此我知道如果计数高于此,则有超过1个字母

更新:解决方案 根据hiro Progator的建议,稍作修改,以下代码似乎可以工作:

full=['a','a','b','b','a','a','c','c','a','a'] 从itertools导入groupby 字母\u pre=[键对键,\u groupbyfull中的组] 信件_post=[] 对于范围为x的字母\u pre: 如果x>0且字母_pre[x]!=[x-1]之前的字母: 信件_post.附录信件_pre[x] 如果x==0: 信件_post.附录信件_pre[x] 印刷信件 唯一的问题是,它不认为有时字母可以出现在独特的,如Noto1所描述的,但这只是一个非常小的问题。更大的问题是,它不考虑两个单独的相同字母出现的情况,例如两个唯一性的例子,例如:“a”、‘a’、‘a’、‘a’、‘b’、‘b’都变成[ [ a’,'b] ],当期望的输出应该是[ a′,' a ','b' ]

这是可以派上用场的地方:

from itertools import groupby

a = ["a", "a", "b", "b", "a", "a", "c", "c"]

res = [key for key, _group in groupby(a)]
print(res)  # ['a', 'b', 'a', 'c']
这是一个可以“缩放”唯一键的版本,但保证结果中至少有一个键:

from itertools import groupby, repeat, chain

a = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'a', 'a',  
     'd', 'd', 'a', 'a']
scale = 0.4

key_count = tuple((key, sum(1 for _item in group)) for key, group in groupby(a))
# (('a', 4), ('b', 2), ('c', 5), ('a', 2), ('d', 2), ('a', 2))

res = tuple(
    chain.from_iterable(
        (repeat(key, round(scale * count) or 1)) for key, count in key_count
    )
)
# ('a', 'a', 'b', 'c', 'c', 'a', 'd', 'a')

可能有更聪明的方法根据输入列表a的长度和平均组长度来确定刻度。

可能是一种奇怪的方法,但是:

b = []
for i in a:
    if next(iter(b[::-1]), None) != i:
        b.append(i)
print(b)
输出:

['a', 'b', 'a', 'c']
请加一些c
你能不能至少再增加一些例子,特别展示你关于比率的陈述?比如,像lst=['a','a','a','a','b','b']这样的列表应该如何解析?如果比率需要精确,那么您需要所有唯一元素的计数。然后需要这些计数中的最大公约数gcd,然后在遇到count/gcdth repeated元素时需要删除。如果比率不需要精确,您需要明确删除规则。我已编辑以包含我尝试过的代码。若要回答您关于否决票的评论,请在“帮助中心右上角>有关网站的问号”中阅读。否决票是一个信号,表明这个问题对更广泛的社区有多大的帮助,也表明了问题的质量。你的问题对任何人都没有帮助,而且被问得很糟糕。最初没有代码,现在太长了。问题和代码应该是a,只有当列表a中的字母每次重复的次数完全相同时,它才起作用。否则,这不会保留ratioOP可能不理解groupby的用法,而且他还没有生成他尝试过的代码。这鼓励用户只发布一个问题而不做任何尝试。不适用于a=[a,b,c,a,b,c]这实际上适用于我的特定问题,但有一个小问题。如何仅将每个分组项目的一份副本(如:[a'、'a'、'a'、'b'、'b'、'a'、'a'、'c'、'c')保存在['a'、'b'、'a'、'c']中?我还对我的问题进行了更精确的编辑。哦,自从我回答之后,这个问题发生了很大的变化!这是处理问题的一种非常奇怪的方式!我非常喜欢它@Hiro主角哈哈,你的解决方案是最好的方法,我知道,但我忘了使用它:P我有点黑客行为:P,如果不是最后一个元素,简单地迭代然后追加:P花了一些时间来思考这个逻辑。哦,这是一个非常聪明的方法。我会尝试一下: