我有两个可能具有重叠值的单独列表(列表)。每个清单都有一个日期。我想修改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']]
答案 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']]