从双循环转换为单循环

时间:2012-06-14 23:51:59

标签: 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 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所有答案 谢谢你的帮助,非常感谢。

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

编辑:重要概念:它需要一本字典和两个数字。这两个数字告诉程序要使用的列表索引。 list = [[a,b,c],[d,e,f],[h,g,i]]与数字0和2一起使用将返回带有三个条目的字典。键将是第一个输入。所以键是d和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'} 这个问题是什么?

3 个答案:

答案 0 :(得分:4)

这是另一种方法,使用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'}

答案 1 :(得分:2)

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'}

只是一个猜测。

答案 2 :(得分:2)

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)

根据雅各布的建议更改为pep8缩进,以便您可以更清楚地看到缩进。你把你的退货声明放错了。

根据astynax的评论纠正了可变违约。