gpt4 book ai didi

Python-读取文件并计算重复元素

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:43 24 4
gpt4 key购买 nike

我有一个文本文件,其中包含如下数字列表:
1
2 5 3
3 5
4
5
每个数字都是树的一个节点。当一行中有多个数字时,表示第一个数字有以下数字链接。
1 后面没有任何数字,因此它没有链接任何数字。
2 与 3 和 5 相链接。
3 有 5 链接到它,并且它自己链接到 2。
4 没有任何与之关联的号码。
5 没有任何与之关联的数字,但它与 3 和 2 关联。
由于 2、3 和 5 连接在一起,它们形成一个组件。 1 和 4 没有链接,也没有链接到它们的数字,因此它们各自形成一个组件。
因此,总共有 3 个组件。
您如何确定组件的数量?我在 for 循环和条件方面遇到了困难。

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'

可能有必要提一下,我正在处理类(class),而且我对这件事几乎不陌生。

最佳答案

您正在使用 for-loops 以正确的方式解决此问题,但您似乎对 loop 所经历的内容感到有点困惑!如果我正确理解您想要实现的目标,我认为我已经编写了可以正常工作的代码。

使用名为 textfile.txt 文件,其内容为:

1
253
35
4
5

下面的代码将创建一个listcomponents,然后print得出最后有多少个components:

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

代码首先将 text 文件打开到 f 中。然后我们开始第一个 loop ,它将遍历 line 中的每个 file 。我们使用 line 上的 list 将这个 ints 转换为 list-comprehensionline.strip() (.strip() 只是从末尾删除了 new-line char

然后我们定义一个 bool - newComponents - 它被初始化为 True 因为我们假设这个 line 将没有 links

接下来,我们通过 loop component 中的每个 list 进行 components 。我们在这里做的第一件事就是快速检查我们之前是否已经找到了该 component 对应的 line。如果有,我们只需从 linked 中取出 break 即可。

否则,如果我们还不是 loop ,我们会遍历 linked 中的每个 element 并检查该 line 是否在我们当前 element 上的 component 中。如果是,我们将 looping (使用 concatenate )我们的 + 放到该 line 上,将 component bool newComponent 设置为 false(因为我们有一个链接)并从该 flag 中设置 break 因为我们找到了 loop

此后,link 行将简单地遍历组件并从每个链接中删除 components = [list(set(c)) for c in components]。例如,如果 duplicates 链接到 3 并且我们之前刚刚将 23 添加到该 5 中,那么该 component 中现在将有 2 3s - 重复。此行只是删除那些 component 。严格来说,这一行不是必需的,因为我们仍然会得到相同的结果,但我只是认为如果您稍后想使用 duplicates ,它会整理代码。

最后,如果没有找到 components ( links 仍然是 newComponent ),我们只需将整个 True (因为它们是 line )附加到 linked components 中。

就是这样!我们对长度进行 list,并在末尾添加 print(),然后您就可以得到结果。

希望这对你有用!

更新

如果len()的内容是多位数字,可以用file.txt分隔:

11
2 45
45 67
8
91

那么我们所要做的就是在 space 的末尾添加一个 .split() :

components = []
with open("file.txt", "r") as f:
for line in f:
line = [int(i) for i in line.strip().split(' ')]
...

它的作用是获取 list-comprehensionstring ,而不是通过 line 中的每个 looping 进行 char ,我们从每个 string 处的 listsplitting 处的 string 生成一个 space 。为了证明这一点:

"123 456 789".split(" ")

给出:

["123", "456", "789"]

关于Python-读取文件并计算重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46629090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com