索引python中没有匹配的列表

时间:2014-12-30 21:09:28

标签: python python-2.7

我有两个可能具有重叠值的单独列表(列表)。每个清单都有一个日期。我想修改mylist1,以便日期(item[3])是mylist1中日期的最小值和mylist2中的相应日期。我遇到的问题是,当没有匹配时,我收到一个错误:IndexError: list index out of range。在这些情况下,我只想不采取最低限度,而只是使用mylist1中的日期。是否有某种if if error子句可以解决它?

我的代码:

mylist1 = [[u'AAA', None, u'111', u'1/1/2015'],
           [u'BBB', None, u'222', u'1/1/2012'],
           [u'CCC', None, u'333', u'1/1/2012']]

mylist2 = [(u'111', u'1/1/2011'),
           (u'333', u'2013-11-10'),
           (u'444', u'1/1/2017')]

for key, item in enumerate(mylist1):
     mylist1[key] = [item[0], item[1], item[2],
                     min(item[3], [x for x in mylist2 if x[0] == item[2]][0][1])]

期望的输出:

[[u'AAA', None, u'111', u'1/1/2011'],
 [u'BBB', None, u'222', u'1/1/2012'],
 [u'CCC', None, u'333', u'1/1/2012']]

4 个答案:

答案 0 :(得分:1)

mylist1 = [[u'AAA', None, u'111' ,u'1/1/2015'], [u'BBB', None, u'222' ,u'1/1/2012'], [u'CCC', None, u'333' ,u'1/1/2012']]
mylist2 = [(u'111', u'1/1/2011'), (u'333', u'2013-11-10'), (u'444', u'1/1/2017')]
for key, item in enumerate(mylist1):
    try:
         mylist1[key] = [item[0],item[1],item[2],min(item[3],[x for x in mylist2 if x[0] == item[2]][0][1])]
    except IndexError:
        #Put your codes that what you want to do if you got this error
        #print ("An error happened but I dont care") <--- like this for example
        pass #or just simply pass this error

实际上你可以决定如果你得到IndexError会发生什么,试试这个。

答案 1 :(得分:1)

如果我做对了,你的mylist2就像字典一样。为什么不把它做成一个:

mylist1 = [[u'AAA', None, u'111' ,u'1/1/2015'], [u'BBB', None, u'222' ,u'1/1/2012'], [u'CCC', None, u'333' ,u'1/1/2012']]
mylist2 = [(u'111', u'1/1/2011'), (u'333', u'2013-11-10'), (u'444', u'1/1/2017')]
# assuming, you are not responsible for the form of mylist2,
# we will change it into a dictionary here:
mydict = dict(mylist2)   # easy :)
for elem_list in mylist1:
    elem_list[3] = min(elem_list[3], mydict.get(elem_list[2], elem_list[3]))

elem_list是对列表的引用,因此我们不需要mylist1中的索引,因为其中的更改将会持续存在。这使得最后一行的其余部分更容易,因为我们不必重新构建原始列表。如果所需元素不可用,mydict.get可以防止错误。

答案 2 :(得分:0)

这是一种很酷的方式如果您有唯一的密钥

# produce dictionaries whose keys are the matching values (have to be uniue)
mylist1dict={x[2]: x for x in mylist1}
mylist2dict={x[0]: x for x in mylist2}
# replace where needed, only use common keys
for k in set(mylist2dict) & set(mylist1dict):
    mylist1dict[k][2] = mylist2dict[k]
# this is the result
mylist1dict.values()

答案 3 :(得分:0)

在某些情况下,您的min函数返回一个空列表您可以使用if语句检查它然后编制索引:

>>> for key, item in enumerate(mylist1):
...     m=min(item[3],[x for x in mylist2 if x[0] == item[2]])
...     if m :
...          mylist1[key] = [item[0],item[1],item[2],m[0][1]]
... 
>>> mylist1
[[u'AAA', None, u'111', u'1/1/2011'], 
 [u'BBB', None, u'222', u'1/1/2012'], 
 [u'CCC', None, u'333', u'1/1/2012']]