Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_Dictionary - Fatal编程技术网

循环后Python字典为空

循环后Python字典为空,python,loops,dictionary,Python,Loops,Dictionary,我有一个如下所示的数据帧: v1 v2 v3 a b a,b b a b,a c a c,a 我试图遍历v3列以创建一个统计唯一字符串组合的字典。在循环中,我需要检查现有的组合和反向组合,以将它们计算为相同的组合,即a,b与b,a相同 以下是我的代码: import pandas as pd df = pd.read_excel("filename.xlsx") combine_count = {} col

我有一个如下所示的数据帧:

    v1    v2    v3
    a    b     a,b
    b    a     b,a
    c    a     c,a
我试图遍历v3列以创建一个统计唯一字符串组合的字典。在循环中,我需要检查现有的组合和反向组合,以将它们计算为相同的组合,即a,b与b,a相同

以下是我的代码:

import pandas as pd
df = pd.read_excel("filename.xlsx")

combine_count = {}
col = df['v3']
for entry in col:
    if entry in combine_count.keys():
        combine_count[entry] += 1
    elif entry not in combine_count.keys():
        reverse = ','.join(entry.split(',')[::-1])
        if reverse in combine_count.keys():
            combine_count[entry] += 1
    else:
        combine_count[entry] = 1
printcombine_count之后的输出是一个空字典{}。如何收集正确的键和值?

为什么不使用和:

计数器可以像任何字典一样使用,而frozenset会注意顺序不重要,只关注内容

您还可以将其转换回具有字符串键的普通词典:

>>> {','.join(sorted(key)): count for key, count in cnts.items()}
{'a,b': 2, 'a,c': 1}

要在代码中修复的两个逻辑问题。1最后一个else语句没有正确缩进,在您的原始代码中它将永远不会执行,因为if和elif涵盖了所有可能的情况,一个键可以在字典中,也可以不在字典中;2如果在combine_count.keys中反转,则应添加一个以反转,因为条目不在字典中,而是在反转中

除此之外,由于您正在使用pandas,这里还有另一种pandas/numpy方法:

import numpy as np
import pandas as pd

# here use maximum and minimum to sort your key before doing any count
(np.minimum(df.v1, df.v2) + "," + np.maximum(df.v1, df.v2)).value_counts().to_dict()

# {'a,b': 2, 'a,c': 1}

我相信,你在寻找的是:

import pandas as pd
df = pd.read_excel("filename.xlsx")

combine_count = {}
col = df['v3']
for entry in col:
    if col[entry] in combine_count.keys():
        combine_count[col[entry]] += 1
    elif col[entry] not in combine_count.keys():
        reverse = ','.join(col[entry].split(',')[::-1])
        if reverse in combine_count.keys():
            combine_count[reverse] += 1
        else:        
            combine_count[col[entry]] = 1
您要做的是检查是否存在值,例如a、b,而不是键。为了便于比较,关键是不相关的,至少就我理解你的意图而言。因此,您需要检查col[entry],而不是检查条目

解决了这个问题,代码使用了正确的缩进,正如我在这里演示的那样,您应该可以开始了。这将以字典的形式返回每个值(包括所有镜像)和每个值的计数


要收集键,可以使用此字典中的值创建一个列表,例如,列中与该值关联的所有键。

发布的代码缩进是否与运行的代码相同?代码甚至不运行-ELSE的缩进有点重要!假设您在实际代码中的缩进是正确的,您需要在代码中放入一些print语句来调试它。我可以告诉您的是,您的if语句中有一条没有其他语句失败,您无法通过不在combine\u count中的elif条目。键:。由于这种情况为真,但如果combine_count.keys:中的reverse为假,则不会向字典中添加任何内容。您需要将Else子句缩进一级。COUNMIE\u count.keys中的条目为true或COUNMIE\u count.keys中的条目不为true,但两个条件都不为false,因此永远不会到达您的Else。正因为如此,你从不在联合计数中输入任何内容
import numpy as np
import pandas as pd

# here use maximum and minimum to sort your key before doing any count
(np.minimum(df.v1, df.v2) + "," + np.maximum(df.v1, df.v2)).value_counts().to_dict()

# {'a,b': 2, 'a,c': 1}
import pandas as pd
df = pd.read_excel("filename.xlsx")

combine_count = {}
col = df['v3']
for entry in col:
    if col[entry] in combine_count.keys():
        combine_count[col[entry]] += 1
    elif col[entry] not in combine_count.keys():
        reverse = ','.join(col[entry].split(',')[::-1])
        if reverse in combine_count.keys():
            combine_count[reverse] += 1
        else:        
            combine_count[col[entry]] = 1