Python 3.x:len(myList)与myList的实际元素数不匹配

Python 3.x:len(myList)与myList的实际元素数不匹配,python,Python,我有一个字典myDict,它包含许多120k+的键,每个键都有相应的列表值 我注意到当我返回myDict时,一些键值(例如列表中的一个元素)将显示lenmyDict[key_with_one_list_entry]>1 据我所知,情况并非相反。 这是什么原因呢?钥匙碰撞会导致这种情况吗 最小可重复性ex: fileDict = defaultdict(list) for file in os.listdir("."): if file.endswith(".sh"): w

我有一个字典myDict,它包含许多120k+的键,每个键都有相应的列表值

我注意到当我返回myDict时,一些键值(例如列表中的一个元素)将显示lenmyDict[key_with_one_list_entry]>1

据我所知,情况并非相反。 这是什么原因呢?钥匙碰撞会导致这种情况吗

最小可重复性ex:

fileDict = defaultdict(list)
for file in os.listdir("."):
    if file.endswith(".sh"):
        with open(file, "r") as file_ptr:
            for i, line in enumerate(file_ptr):
                if i == 0:
                    continue
                fileName = line.split("/")
                _targetId = _getFileParametersFromFileName(fileName[-1][0:-1])
                fileDict[_targetId].append(fileName[-1][0:-1])


def _getFileParametersFromFileName(fileName):

    _fileNameParameterList = fileName.split("-")
    return _fileNameParameterList[2]
这些文件是以前创建的,没有冲突的风险,因为它们是目录中唯一的*.sh文件。
fileDict中大约有130k个键,列表值范围从1到12个条目。

欢迎使用Stackoverflow

你错了。考虑一下,Python是一个二十年的语言,有一个积极的开发团队和一个庞大的测试银行。扪心自问,这样一个根本性的bug一直没有被发现,直到代码出现时才被发现的可能性有多大

学习编程更困难的一个方面是接受你总是犯可以避免的错误。你的问题假设得相当多,没有提供任何证据


我建议你要么编辑这个问题,这样你就可以证明到底出了什么问题,要么删除它并发布一个新的问题。你可能会发现制定你的问题以吸引答案很有帮助。

好吧,我来咬一口。我已经像这样修改了你的代码

from glob import iglob
from collections import defaultdict

target_files = defaultdict(list)

for path in iglob('tesscurl*.sh'):
    with open(path, "r") as file:
        for i, line in enumerate(file):
            if i == 0:
                continue

            file_name = line.split("/")[-1].strip()
            target_id = file_name.split("-")[2]
            target_files[target_id].append(file_name)


def print_target(target):
    print(target, len(target_files[target]), target_files[target])


print_target('0000000000001275')
print_target('0000000000028465')
这个输出

0000000000001275 1 ['tess2019112060037-s0011-0000000000001275-0143-s_lc.fits']
0000000000028465 1 ['tess2019112060037-s0011-0000000000028465-0143-s_lc.fits']

或者简而言之:我无法重现这个问题。现在,在对另一个答案的评论中,您提到在笔记本中运行此功能。您是否知道单个单元格的重复运行可能会错误地更新全局状态,从而导致目标字典被更新多次?我怀疑这是当前的问题,而不是Python中的一些基本内容,我们似乎都无法复制。我建议您重新启动内核以清除工作区,然后重新运行所有单元格以确定是否正确。

printmyDict[key\u with\u one\u list\u entry]打印什么?此键中有什么内容?如果它是字符串,那么您就可以得到这个字符串的长度。lists/dicts是python的核心部分。。。我可以合理地确定,错误不在于python,而在于你认为你拥有的东西与你实际拥有的东西。。。但是这里并没有足够的信息来帮助您解决问题。可生产性意味着有人可以运行您的代码并复制您看到的内容。您还没有提供构造字典的代码,该字典包含奇数属性,作为值1元素列表,Python len函数报告它具有多个1元素。相反,您提供的代码在未知文件上运行时会与您未说明的期望相冲突。@Kabel我不想在这里难懂,但您确实需要阅读。你的问题需要包含整个问题。根据链接,完成-提供其他人在问题中重现你的问题所需的所有部分。回答好+1,尽管它实际上更像是一条注释,因为注释太大,无法作为注释。大多数程序员都会遇到一些错误,这些错误会使他们怀疑自己的理智或世界的合理性。也许这就是OP.@Kabel的例子之一。你是否只是打印了一个你认为只有一个元素但len说不止一个元素的列表?对你的问题的第一个评论也许是最好的,但你从未回应过。我不认为人们很敏感,但你的措辞和问题的标题本身至少表明你认为问题在于Python而不是你的代码。@Kabel你是如何打印列表的?它仅仅是printmyDict[key_with_one_list_entry]还是类似于myDict[key_with_one_list_entry]:prints中的s?只是为了好玩:python始于1989年!它最早于1991年发行,现在已经接近30岁了!当您认为[lens for s in fdict['0000000000001275']]的长度为1,而Python报告的长度为12时,[lens for s in fdict['0000000000001275']]会产生什么结果?最可能的解释是该列表有1个非空字符串和11个空字符串。