使用多个元组管理多个列表

2024-09-30 02:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大约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')]
.
.
.

它们基本上是多个列表,每个列表都包含在各自的元组中的人名、dob、loc等详细信息。你知道吗

我想按以下格式提取所有人的姓名及其相应的出生日期:

('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',并获得输出。你知道吗


Tags: textname列表newif格式tempjuly
3条回答

我建议编写一个helper函数,从数据中检索信息。我还假设您使用的是元组列表。你知道吗

 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')

你可以很容易地用“出生日期”代替“出生日期”。你知道吗

您可以这样做:

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']

以这种方式,结果独立于项“NAME”和“DOB”在元组中的位置,但仅当实际名称始终跟随“tag”'NAME'时,如这里所示:(0, 3, 'NAME', 'Vance Trimble'),其中实际名称跟随NAME。你知道吗

将问题分解为简单的步骤:

  1. 循环浏览记录列表。你知道吗
  2. 每个记录都由一个元组列表组成,这些元组的顺序有些任意。你知道吗
  3. 查看记录(循环)中的每个元组,查找NAME和DOB。你知道吗
  4. 找到时,将元组中所需的数据添加到结果中。你知道吗

维奥拉!你知道吗

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)

相关问题 更多 >

    热门问题