Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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_File_Class_For Loop - Fatal编程技术网

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请投票并接受,如果这有用的话:)