Python-读取文件并计算重复的元素
我有一个包含如下数字列表的文本文件:Python-读取文件并计算重复的元素,python,file,class,for-loop,Python,File,Class,For Loop,我有一个包含如下数字列表的文本文件: 1 2.5.3 35 4 5 每个数字都是树的一个节点。当一行中有多个数字时,表示第一个数字链接了以下数字。 1后面没有任何数字,因此没有任何数字链接。 2有3和5链接到它。 3有5个链接到它,而它的LNK本身链接到2。 4没有任何数字链接到它。 5没有任何数字链接到它,但它链接到了3和2。 由于2、3和5连接在一起,因此它们构成一个组件。1和4没有链接,也没有链接到它们的数字,因此它们各自构成一个组件。 因此,总共有3个组件。 您将如何确定组件的数量? 我
1
2.5.3
35
4
5
每个数字都是树的一个节点。当一行中有多个数字时,表示第一个数字链接了以下数字。
1后面没有任何数字,因此没有任何数字链接。
2有3和5链接到它。
3有5个链接到它,而它的LNK本身链接到2。
4没有任何数字链接到它。
5没有任何数字链接到它,但它链接到了3和2。
由于2、3和5连接在一起,因此它们构成一个组件。1和4没有链接,也没有链接到它们的数字,因此它们各自构成一个组件。
因此,总共有3个组件。
您将如何确定组件的数量? 我对循环和条件语句的很难理解
def components(self):
elm = 0
with open('file.txt','r') as f:
for line in f:
comp = list(line)
for x in comp:
if comp[x] != comp[x+1]:
elm += 1
else:
pass
print(elm)
我试过上面的代码。但是,当我运行它时,我会得到函数执行中的下一条消息:
components missing 1 required positional argument: 'self'
可能有必要提及的是,我正在使用类,而我对这方面几乎不陌生。您使用
for loops
的方法是正确的,但是您似乎对自己的循环有点困惑!如果我正确理解了您想要实现的目标,那么我认为我已经编写了能够正常工作的代码
使用名为file.txt的text
文件,其中包含以下内容:
1
253
35
4
5
以下代码将创建组件的列表
,然后打印出最后有多少组件
:
components = []
with open("file.txt", "r") as f:
for line in f:
line = [int(i) for i in line.strip()]
newComponent = True
for comp in components:
if not newComponent:
break
for ele in line:
if ele in comp:
comp += line
newComponent = False
break
components = [list(set(c)) for c in components]
if newComponent:
components.append(line)
print(len(components))
输出您想要的内容:
3
代码首先将文本
文件打开到f
中。然后我们开始第一个循环
,它将遍历文件中的每一行
。我们使用line.strip()
(.strip()
)上的列表理解功能将这一行
转换为一个列表
中的ints
(.strip()
),只需从末尾删除新行
字符
然后,我们定义一个bool
-newComponents
,它被初始化为True
,因为我们假设该行
将没有链接
接下来,我们通过列表中的每个组件循环。我们在这里做的第一件事就是快速检查我们之前是否已经找到了一个组件,该行链接到了中。如果有,我们只是将从这个循环中分离出来
否则,如果我们还没有链接到,行中的每个元素
,检查元素
是否在组件
中,我们当前正在循环
中。如果是,我们将连接到(使用+
)我们的行
放在组件
上,设置bool
新组件
标志
false(因为我们有一个链接)和从这个循环
中中断
,因为我们找到了链接
在此之后,行:components=[list(set(c))for c in components]
只需遍历组件并从每个链接中删除重复的。因此,例如,如果3
链接到2
,我们之前刚刚在组件中添加了3
和5
,那么组件中现在将有2
3s
-一个重复。这一行只是删除了那些重复的。严格来说,这一行是不必要的,因为我们仍然会得到相同的结果,但我只是认为如果您以后想使用组件,它会整理代码
最后,如果没有找到链接
(newComponent
仍然是True
),我们只需将整个行
(因为它们是链接的
)附加到组件
列表中
就是这样!我们用print()
长度和len()
希望这对你有用
更新
如果file.txt
的内容是多位数的数字,则可以使用空格将其分隔开来:
11
2 45
45 67
8
91
然后我们所要做的就是在列表的末尾添加一个.split()
:
components = []
with open("file.txt", "r") as f:
for line in f:
line = [int(i) for i in line.strip().split(' ')]
...
这样做的目的是取行的字符串,而不是循环通过字符串中的每个字符,我们从拆分字符串在每个空间进行迭代来演示这一点:
"123 456 789".split(" ")
给出:
["123", "456", "789"]
您期望的输出是什么?self
是对函数类的引用。如果它不是任何类的一部分,那么您需要从函数定义中删除self
。非常感谢。这非常有效。我只是有一个问题。如果我使用的数字超过一位,需要做哪些更改ne?@Cotton EyeJoe我现在将其添加到答案中:)@Cotton EyeJoe请投票并接受,如果这有用的话:)