在使用 python 的嵌套 for 循环中使用 "and" 逻辑时如何使用多个 if else 条件
How to use multiple if else conditions when using "and" logic in a nested for-loop using python
- 我有一个列表的列表
- 最外层的列表是整个成员集合,里面的每个列表都是单独的成员,里面是原始文本文件的每一行,我把它分成了单独的元素。
- 每个成员的记录都有一个姓名行,由
"NM1"
标签表示
- 但并非每个成员都有“结束日期”字段,由
'DTP'
和 '349'
标签指示
- 同样,并非每个成员都有“先前 ID”字段,由
'REF'
和 '0F'
标签表示
- 我想遍历每条记录,如果我需要的字段在那里,提取我需要的列表元素并附加到新列表。如果不存在,请附加一个
None
值作为占位符。我需要每个列表具有相同数量的值,因此当我将它们作为 pandas 系列放入 DataFrame 时,每个系列具有相同的长度。
我把数据解析成我想要的格式,作为一个简单的例子。
Groups = [[['NM1', 'IL', '1', 'SMITH', 'JOHN', 'PAUL', 'MR', 'JR', ''],
['REF', '1L', '690553677', ''],
['DTP', '348', 'D8', '20200601', ''],
['DTP', '349', 'D8', '20200630', '']],
[['NM1', 'IL', '1', 'IMA', 'MEAN', 'TURD', 'MR', 'SR', ''],
['REF', '1L', '690545645', ''],
['REF', '0F', '001938383',''],
['DTP', '348', 'D8', '20200601', '']]]
我尝试使用 for 循环遍历每条记录,如果这些特殊“标签”的组合存在于组中,则将其附加到一个新列表中,只包含我想要的最后一个元素(日期,或ID #)。
当我尝试为每个元素使用多个 if
- else
条件时,我只得到 None
值。
current_id = []
prior_id = []
start_date = []
end_date = []
for group in Groups:
if ((line[0] == 'REF') and (line[1] == 'IL')) in (line for line in group):
current_id.append(line[2])
else:
current_id.append(None)
if ((line[0] == 'REF') and (line[1] == '0F')) in (line for line in group):
prior_id.append(line[2])
else:
prior_id.append(None)
if ((line[0] == 'DTP') and (line[1] == '348')) in (line for line in group):
start_date.append(line[2])
else:
start_date.append(None)
if ((line[0] == 'DTP') and (line[1] == '349')) in (line for line in group):
end_date.append(line[2])
else:
end_date.append(None)
print(current_id)
print(prior_id)
print(start_date)
print(end_date)
[None, None]
[None, None]
[None, None]
[None, None]
应该是:
['690553677','690545645']
[None, '001938383']
['20200601', '20200601']
['20200630', None]
我知道我的逻辑一定是错误的,但是最好的方法是什么?
您可以使用 for
和 else
语句,我定义了一个名为 ids
的函数,它将检索 ID:
Groups = [[['NM1', 'IL', '1', 'SMITH', 'JOHN', 'PAUL', 'MR', 'JR', ''],
['REF', '1L', '690553677', ''],
['DTP', '348', 'D8', '20200601', ''],
['DTP', '349', 'D8', '20200630', '']],
[['NM1', 'IL', '1', 'IMA', 'MEAN', 'TURD', 'MR', 'SR', ''],
['REF', '1L', '690545645', ''],
['REF', '0F', '001938383',''],
['DTP', '348', 'D8', '20200601', '']]]
def ids(a, b):
l = []
for group in Groups:
for lst in group:
if lst[:2] == [a, b]:
if lst[2] == 'D8':
l.append(lst[3])
else:
l.append(lst[2])
break
else:
l.append(None)
return l
current_id = ids('REF', '1L')
prior_id = ids('REF', '0F')
start_date = ids('DTP', '348')
end_date = ids('DTP', '349')
print(current_id)
print(prior_id)
print(start_date)
print(end_date)
输出:
['690553677', '690545645']
[None, '001938383']
['20200601', '20200601']
['20200630', None]
注意我使用的 if
语句:if lst[2] == 'D8':
。我使用它是因为我看到并非所有列表的 ID 号都在索引 2
处,有些在索引 3
.
处
- 我有一个列表的列表
- 最外层的列表是整个成员集合,里面的每个列表都是单独的成员,里面是原始文本文件的每一行,我把它分成了单独的元素。
- 每个成员的记录都有一个姓名行,由
"NM1"
标签表示 - 但并非每个成员都有“结束日期”字段,由
'DTP'
和'349'
标签指示 - 同样,并非每个成员都有“先前 ID”字段,由
'REF'
和'0F'
标签表示 - 我想遍历每条记录,如果我需要的字段在那里,提取我需要的列表元素并附加到新列表。如果不存在,请附加一个
None
值作为占位符。我需要每个列表具有相同数量的值,因此当我将它们作为 pandas 系列放入 DataFrame 时,每个系列具有相同的长度。
我把数据解析成我想要的格式,作为一个简单的例子。
Groups = [[['NM1', 'IL', '1', 'SMITH', 'JOHN', 'PAUL', 'MR', 'JR', ''],
['REF', '1L', '690553677', ''],
['DTP', '348', 'D8', '20200601', ''],
['DTP', '349', 'D8', '20200630', '']],
[['NM1', 'IL', '1', 'IMA', 'MEAN', 'TURD', 'MR', 'SR', ''],
['REF', '1L', '690545645', ''],
['REF', '0F', '001938383',''],
['DTP', '348', 'D8', '20200601', '']]]
我尝试使用 for 循环遍历每条记录,如果这些特殊“标签”的组合存在于组中,则将其附加到一个新列表中,只包含我想要的最后一个元素(日期,或ID #)。
当我尝试为每个元素使用多个 if
- else
条件时,我只得到 None
值。
current_id = []
prior_id = []
start_date = []
end_date = []
for group in Groups:
if ((line[0] == 'REF') and (line[1] == 'IL')) in (line for line in group):
current_id.append(line[2])
else:
current_id.append(None)
if ((line[0] == 'REF') and (line[1] == '0F')) in (line for line in group):
prior_id.append(line[2])
else:
prior_id.append(None)
if ((line[0] == 'DTP') and (line[1] == '348')) in (line for line in group):
start_date.append(line[2])
else:
start_date.append(None)
if ((line[0] == 'DTP') and (line[1] == '349')) in (line for line in group):
end_date.append(line[2])
else:
end_date.append(None)
print(current_id)
print(prior_id)
print(start_date)
print(end_date)
[None, None]
[None, None]
[None, None]
[None, None]
应该是:
['690553677','690545645']
[None, '001938383']
['20200601', '20200601']
['20200630', None]
我知道我的逻辑一定是错误的,但是最好的方法是什么?
您可以使用 for
和 else
语句,我定义了一个名为 ids
的函数,它将检索 ID:
Groups = [[['NM1', 'IL', '1', 'SMITH', 'JOHN', 'PAUL', 'MR', 'JR', ''],
['REF', '1L', '690553677', ''],
['DTP', '348', 'D8', '20200601', ''],
['DTP', '349', 'D8', '20200630', '']],
[['NM1', 'IL', '1', 'IMA', 'MEAN', 'TURD', 'MR', 'SR', ''],
['REF', '1L', '690545645', ''],
['REF', '0F', '001938383',''],
['DTP', '348', 'D8', '20200601', '']]]
def ids(a, b):
l = []
for group in Groups:
for lst in group:
if lst[:2] == [a, b]:
if lst[2] == 'D8':
l.append(lst[3])
else:
l.append(lst[2])
break
else:
l.append(None)
return l
current_id = ids('REF', '1L')
prior_id = ids('REF', '0F')
start_date = ids('DTP', '348')
end_date = ids('DTP', '349')
print(current_id)
print(prior_id)
print(start_date)
print(end_date)
输出:
['690553677', '690545645']
[None, '001938383']
['20200601', '20200601']
['20200630', None]
注意我使用的 if
语句:if lst[2] == 'D8':
。我使用它是因为我看到并非所有列表的 ID 号都在索引 2
处,有些在索引 3
.