为python中不匹配的列表编制索引

为python中不匹配的列表编制索引,python,python-2.7,Python,Python 2.7,我有两个单独的列表(列表),它们可能有重叠的值。每个列表都有一个日期。我想修改mylist1,以便日期(项[3])是mylist1中的日期和mylist2中的相应日期中的最小日期。我遇到的问题是,当没有匹配项时,我会得到一个错误:索引器:列表索引超出范围。在这些情况下,我不想取最小值,而只是使用mylist1中的日期。有什么样的if-error子句可以用在它周围吗 我的代码: mylist1 = [[u'AAA', None, u'111', u'1/1/2015'], [

我有两个单独的列表(列表),它们可能有重叠的值。每个列表都有一个日期。我想修改
mylist1
,以便日期(
项[3]
)是
mylist1
中的日期和
mylist2
中的相应日期中的最小日期。我遇到的问题是,当没有匹配项时,我会得到一个错误:
索引器:列表索引超出范围
。在这些情况下,我不想取最小值,而只是使用
mylist1
中的日期。有什么样的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']]

如果您有唯一的键,这是一种很酷的方法:

# 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()
mylist1=[[u'AAA',无,u'111',u'1/1/2015'],[u'BBB',无,u'222',u'1/1/2012'],[u'CCC',无,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')]
对于键,枚举(mylist1)中的项:
尝试:
mylist1[key]=[item[0],item[1],item[2],min(item[3],[x代表mylist2中的x,如果x[0]==item[2]][0][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
可防止出现错误。

在某些情况下,您的
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']]

只需定义您自己的
min
特殊版本,考虑到这种可能性即可。@ScottHunter似乎过度卷入其中。将其包装在
try
块中会更清楚。@AdamSmith:if-present use-min-else-not“有多复杂?”@ScottHunter您所描述的并不是我所说的“定义您自己的
min
”的特殊版本:)
>>> 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']]