根据条件从列表中删除元素

如何解决根据条件从列表中删除元素

我有以下代码

from collections import defaultdict
import pandas as pd

THRESHOLD = 3 

item_counts = defaultdict(int)

df = {'col1':['1 2 3 4 5 6 7','1 3 6 7','2 6 7']}
lines = pd.DataFrame(data=df)

print(lines)

for line in lines['col1']:
    for item in line.split():
        item_counts[item] += 1

print(item_counts)         
for line in lines['col1']:
    for item in line.split():
        if item_counts[item] < THRESHOLD:
            del item

print(lines)

我的目标是对每个项目进行计数,并将低于阈值的项目从我的数据框中删除在这种情况下,只应保留 6 和 7,其余的应删除。 defaultdict 工作正常,但删除项目不起作用。

你知道我做错了什么吗?

解决方法

使用 del 与从列表中删除元素不同。 考虑下面的例子

>>> x=1
>>> y=2
>>> lst = [x,y]
>>> del x
>>> print(lst)
[1,2]
>>> lst.remove(x)
Traceback (most recent call last):
  File "<input>",line 1,in <module>
NameError: name 'x' is not defined
>>> lst.remove(y)
>>> print(lst)
[1]
>>> print(y)
2

如您所见,在变量上使用 del 共享指向列表中元素的指针 只删除了离开列表的指针。 remove 正好相反。它从列表中删除了元素,但没有删除变量指针。

至于解决问题:迭代时不应该直接从列表中删除。

IMO 最好的解决方法是使用列表理解来创建一个仅包含所需元素的新列表并替换旧列表:

for line in lines['col1']:
    line = [item for item in line.split() if item >= THRESHOLD
    # line = ' '.join(line)

附言 如果您希望将行返回到字符串,请添加注释行

,

如果您不需要 DataFrame(我不明白您为什么要这样做),您可以这样做:

from collections import Counter

THRESHOLD = 3
lines = {'col1':['1 2 3 4 5 6 7','1 3 6 7','2 6 7']}

# make proper list of ints
z = {k: [[int(x) for x in v.split()] for v in vals] for k,vals in lines.items()}
print(z)
# {'col1': [[1,2,3,4,5,6,7],[1,[2,7]]}

# count the items within each value of the dict
z = {k: Counter(x for vals in arr for x in vals) for k,arr in z.items()}
print(z)
# {'col1': Counter({6: 3,7: 3,1: 2,2: 2,3: 2,4: 1,5: 1})}

# select the items that are seen at least THRESHOLD times
z = {col: [k for k,v in cnt.items() if v >= THRESHOLD] for col,cnt in z.items()}
print(z)
# {'col1': [6,7]}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?