在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]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花了一些时间来思考这个逻辑。哦,这是一个非常聪明的方法。我会尝试一下: