Python 从双循环转换为单循环

Python 从双循环转换为单循环,python,Python,这个程序根据您希望从列表中获得的两个索引号,从列表中构建一个字典。 这是输出 {'a':2,'c':7,'b':'h'} def buildDict2(theList,inputOne,inputTwo) : newdict={} for a in theList: if inputTwo >= len(a): print "error" return "error" if in

这个程序根据您希望从列表中获得的两个索引号,从列表中构建一个字典。 这是输出

{'a':2,'c':7,'b':'h'}

def buildDict2(theList,inputOne,inputTwo) :
    newdict={}
    for a in theList:
        if inputTwo >= len(a):
                print "error"
                return "error"
        if inputOne >= len(a):
                print "error"
                return "error"
        for oneValue in a: 
                    print len(a)

                    varkey=a[inputOne]
                    varvalue=a[inputTwo]
                    newdict[varkey]=varvalue


    return newdict
print buildDict2([["a", "s","d", 2,0,1],["b", "f",3,"h",0,2],["c", "g",5,7]],0,3)
如何将其转换为单个循环? +1所有答案 谢谢你的帮助,非常感谢

基本上我只需要使用一个循环,而不是两个

编辑:重要概念:它需要一本字典和两个数字。这两个数字告诉程序要使用的列表索引。与数字0和2一起使用的list=[[a,b,c],[d,e,f],[h,g,i]]将返回一个包含三个条目的字典。这些键将是第一个输入。键是ad和h,值是第二个输入的列表索引,c,e,i。明白了吗

对于此代码

def buildDict2(theList, range1, range2, newdict = {}):
    for a in theList:
        if range2 >= len(a) or range1 >= len(a):
            return "error"
        newdict[a[range1]] = a[range2]
        return newdict
print buildDict2([["a", "s","d", 2,0,1],["b", "f",3,"h",0,2],["c", "g",5,7]],0,3)
我得到了{'a':2} 当我想得到 {'a':2,'c':7,'b':'h'} 有什么问题吗

def buildDict2(theList, pos1, pos2):
    di = {}
    for element in theList:
        try:
            di[element[pos1]] = element[pos2]
        except IndexError:
            return "Error" # <- Idk?
    return di

assert buildDict2([["a", "s","d", 2,0,1],["b", "f",3,"h",0,2],["c", "g",5,7]],0,3) == {'a': 2, 'c': 7, 'b': 'h'}
只是猜测而已

def buildDict2(theList, range1, range2):
    newdict = {}
    for a in theList:
        if range2 >= len(a) or range1 >= len(a):
            return "error"
        newdict[a[range1]] = a[range2]
    return newdict
if __name__ == '__main__':
    print buildDict2([["a", "s","d", 2,0,1],["b", "f",3,"h",0,2],["c", "g",5,7]],0,3)
根据Jakob的建议更改为pep8缩进,以便您可以更清楚地看到缩进。您将返回语句放在了错误的级别


根据astynax的评论更正了可变默认值。

还有另一种方法,使用map而不是显式循环:

>>> from operator import itemgetter
>>> def build_dict(lists, key_idx, value_idx):
...     return dict(map(itemgetter(key_idx, value_idx), lists))
...
>>> build_dict([["a", "s","d", 2,0,1],["b", "f",3,"h",0,2],["c", "g",5,7]],0,3)
{'a': 2, 'c': 7, 'b': 'h'}

快速提问,什么是range1和range1及其值,为什么没有列表理解?您正在清理列表并将其转换为字典吗?你可能想用一些答案更新你的帖子-谢谢。你好,列文,很高兴再次见到你,也很有帮助。range1和range2只是命名不好的变量。它们表示列表元素的索引号。这个程序根据你想从列表中得到的两个索引号从列表中建立一个字典。。。等等什么。。。甚至都不知道这段代码中发生了什么所以range1和range2描述了列表中您感兴趣的项目的开始索引和结束索引?“只是澄清一下,”雅各布鲍耶说,这需要一本字典和两个数字。这两个数字告诉程序要使用的列表索引。与数字0和2一起使用的list=[[a,b,c],[d,e,f],[h,g,i]]将返回一个包含三个条目的字典。这些键将是第一个输入。键是ad和h,值是第二个输入的列表索引,c,e,i。明白了吗?好的猜测,不能真正理解它,什么是断言?如果语句失败,语句将我的函数与测试输出进行比较,它就会抛出异常。AsStRead仅仅是一个简单的测试,看看事情是否是你所期望的,这个例子=3;b=3+a;断言b==6我用谷歌搜索了一下,这很奇怪。想不出它的实际用途,因为它的标准缩进是4个空格。请修正:哇,谢谢你的-1,因为你不喜欢我的缩进。如果name='main':不要抱怨减去一个lol,我以前的帐户在每个帖子上都得到+1-+3,一篇帖子得到15个否定。禁止我提问。拜托,杰克,你应该知道速度在python中不是最重要的。虽然,我同意代码看起来有点难看。