2016-10-07 23 views
1

我有以下格式数据的约2000行:管理多个列表与多个元组

. 
. 
[(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Ayiesha Woods'), (5, 10, 'DOB', 'July 2 , 1979'), (10, 13, 'LOC', 'Long Island'), (13, 16, 'LOC', 'New York')] 
[(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Craig Rivera'), (7, 12, 'DOB', 'October 10 , 1954'), (5, 7, 'LOC', 'Manhattan')] 
[(0, 1, 'Blank', ''), (0, 4, 'NAME', 'Margery Pitt Durant'), (14, 16, 'LOC', 'Flint'), (6, 11, 'DOB', 'May 24 , 1887'), (16, 18, 'LOC', 'Michigan')] 
[(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Austin Watson'), (10, 13, 'LOC', 'Ann Arbor'), (13, 15, 'LOC', 'Michigan'), (4, 9, 'DOB', 'January 13 , 1992')] 
[(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Gary Spatz'), (5, 8, 'LOC', 'New York'), (16, 19, 'LOC', 'New York'), (19, 21, 'LOC', 'Miami'), (21, 23, 'LOC', 'Florida'), (8, 13, 'DOB', 'April 1 , 1951')] 
. 
. 
. 

他们基本上很多列出每个包含的人喜欢的名字,出生日期,禄等内部各细节他们元组。

我想提取所有的人的名字,并以下列格式及其相应的出生日期:

('Ayiesha Woods', 'DateOfBirth', 'July 2 , 1979') 
('Craig Rivera', 'DateOfBirth', 'October 10 , 1954') 

等..

这是我的尝试:

temp = "DateOFBirth" 
results = [] 

for n1 in text: 
    for n2 in text: 
     if n1 is not n2: 
      if text[1][2] == 'NAME' and text[2][2] == 'DOB': 
       rel = text[1][3], temp, text[2][3] 
       print(rel) 
      results.append(rel) 

只有在名称元组位于位置1并且日期元组位于列表中的位置2时才会输出,但并非总是如此。

如果我想输出结果而不管名单元组或日期元组在位置列表中的位置,我该怎么做。

编辑:

我有一个包含像元组的列表:

text = [(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Vance Trimble'), (5, 7, 'LOC', 'Harrison'), (7, 9, 'LOC', 'Arkansas'), (9, 14, 'DOB', 'July 6 , 1913')] 

我期待在下面的格式来提取数据:

('Vance Trimble', 'DateOFBirth', 'July 6 , 1913') 

我的代码:

temp = "DateOFBirth" 
if text[1][2] == 'NAME' and text[4][2] == 'DOB': 
    rel = text[1][3], temp, text[4][3] 
    print(rel) 

何做到我这样做,而不必硬编码,如:

text[1][2] == 'NAME' and text[4][2] == 'DOB' 

,使其自身搜索列表“NAME”和“DOB”,并得到输出。

+0

你能否给出准确的列表来尝试你的代码,因为你提供的信息不容易重现你的代码,甚至不明白你具体询问什么... – coder

+0

什么是你的数据类型?以及你如何拥有“文字”?它的格式是什么? – Kasramvd

+0

我不确定嵌套for循环是什么。也许还有一些你没有提到的其他要求? – intrepidhero

回答

1

你可以这样做:

temp = "DateOFBirth" 
text = [(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Vance Trimble'), (5, 7, 'LOC', 'Harrison'), (7, 9, 'LOC', 'Arkansas'), (9, 14, 'DOB', 'July 6 , 1913')] 
rel = [] 
for i in text: 
    if 'NAME' in i: 
     rel.append(i[i.index('NAME')+1])  
     rel.append(temp)  
    elif 'DOB' in i: 
     rel.append(i[i.index('DOB')+1])   
print rel 
# result: 
# ['Vance Trimble', 'DateOFBirth', 'July 6 , 1913'] 

这样的结果是独立的项目“名称”和“DOB”中的元组的位置,但前提是如实际名称始终在'tag''NAME'之后,因为它在此处:(0, 3, 'NAME', 'Vance Trimble'),其中实际名称跟在NAME之后。

2

分解问题转化为简单的步骤:

  1. 遍历记录列表。
  2. 每条记录​​都以一定的顺序包含一个元组列表。
  3. 查看记录(循环)中的每个元组以查找NAME和DOB。
  4. 找到后,从元组中添加所需的数据。

Viola!

results = [] 
for rec in records: 
    result = ["", "DateOfBirth", ""] 
    for item in rec: 
     if "NAME" in item: 
      result[0] = item[3] 
     elif "DOB" in item: 
      result[2] = item[3] 
    results.append(tuple(result)) 
print(results) 
+0

使用赋值'=',不等于'==' –

+0

呵呵!接得好。 – intrepidhero

1

我会建议编写一个帮助函数,它从数据中检索信息。我还假设你正在处理一系列元组列表。

test_list = [[(0, 1, 'Blank', ''), 
    (0, 3, 'NAME', 'Ayiesha Woods'), 
    (5, 10, 'DOB', 'July 2 , 1979'), 
    (10, 13, 'LOC', 'Long Island'), 
    (13, 16, 'LOC', 'New York')], 
[(0, 1, 'Blank', ''), 
    (0, 3, 'NAME', 'Craig Rivera'), 
    (7, 12, 'DOB', 'October 10 , 1954'), 
    (5, 7, 'LOC', 'Manhattan')], 
[(0, 1, 'Blank', ''), 
    (0, 4, 'NAME', 'Margery Pitt Durant'), 
    (14, 16, 'LOC', 'Flint'), 
    (6, 11, 'DOB', 'May 24 , 1887'), 
    (16, 18, 'LOC', 'Michigan')], 
[(0, 1, 'Blank', ''), 
    (0, 3, 'NAME', 'Austin Watson'), 
    (10, 13, 'LOC', 'Ann Arbor'), 
    (13, 15, 'LOC', 'Michigan'), 
    (4, 9, 'DOB', 'January 13 , 1992')], 
[(0, 1, 'Blank', ''), 
    (0, 3, 'NAME', 'Gary Spatz'), 
    (5, 8, 'LOC', 'New York'), 
    (16, 19, 'LOC', 'New York'), 
    (19, 21, 'LOC', 'Miami'), 
    (21, 23, 'LOC', 'Florida'), 
    (8, 13, 'DOB', 'April 1 , 1951')]] 

#Helper function 
def get_person_info(lst): 
    person_name = list(filter(lambda x: 'NAME' in x, lst))[0][3:] 
    person_dob = list(filter(lambda x: 'DOB' in x, lst))[0][2:4] 
    return person_name + person_dob 

#Use it with map 
list(map(get_person_info, test_list)) 

输出:

[('Ayiesha Woods', 'DOB', 'July 2 , 1979'), 
('Craig Rivera', 'DOB', 'October 10 , 1954'), 
('Margery Pitt Durant', 'DOB', 'May 24 , 1887'), 
('Austin Watson', 'DOB', 'January 13 , 1992'), 
('Gary Spatz', 'DOB', 'April 1 , 1951')] 

测试与text辅助功能:

text = [(0, 1, 'Blank', ''), (0, 3, 'NAME', 'Vance Trimble'), (5, 7, 'LOC', 'Harrison'), (7, 9, 'LOC', 'Arkansas'), (9, 14, 'DOB', 'July 6 , 1913')] 

get_person_info(text) 

## ('Vance Trimble', 'DOB', 'July 6 , 1913') 

您可以轻松地更换 'DOB' 与 '出生日期'。

+0

过滤器行结束时的列表indecies是什么?我似乎无法弄清楚。 – intrepidhero

+0

'filter'不会在'Python3'中返回一个列表;所以你必须强制输出到列表中,抓住第一个元素('tuple'索引为0)。 – Abdou

+0

对。我的意思是切片。 [3:]?我可能会有点紧张。 – intrepidhero