【问题标题】:How to merge two lists at a delimited token in python3如何在python3中的分隔标记处合并两个列表
【发布时间】:2011-03-25 02:47:41
【问题描述】:

我是阿拉巴马大学的一名计算机科学专业的学生,​​我们的 python 课程中有一个项目,但我被困住了……可能是出于某种愚蠢的原因,但我似乎找不到答案。

这里是项目的链接,因为在这里尝试解释会很痛苦。

http://beastie.cs.ua.edu/cs150/projects/project1.html

这是我的代码:

import sys
from scanner import scan

def clInput():
    #Gets command line input

    log1 = sys.argv[1]
    log2 = sys.argv[2]
    name = sys.argv[3]

    if len(sys.argv) != 4:
        print('Incorrect number of arguments, should be 3')
        sys.exit(1)
    return log1,log2,name

def openFiles(log1,log2):
    #Opens sys.argv[1]&[2] for reading

    f1 = open(log1, 'r')
    f2 = open(log2, 'r')
    return f1, f2


def merge(log1,log2):
    #Merges parsed logs into list without '---'

    log1Parse = [[]]
    log2Parse = [[]]
    log1Count = 0
    log2Count = 0
    for i in log1:
        if i != ['---']:
            log1Parse[log1Count].append(i)
        else:
            log1Count += 1
            log1Parse.append([])

    for i in log2:
        if i != ['---']:
            log2Parse[log2Count].append(i)
        else:
            log2Count += 1
            log2Parse.append([])

return(log1Parse[0] + log2Parse[0] + log1Parse[1] + log2Parse[1])


def searchMerge(name,merged):
    #Searches Merged list for sys.argv[3]

    for i in range(len(merged)):
        if (merged[i][1] == name):
            print(merged[i][0],merged[i][1]," ".join(merged[i][2:]))



def main():
    log1,log2,name = clInput()
    f1,f2 = openFiles(log1,log2)

    #Sets the contents of the two scanned files to variables
    tokens1 = scan(f1)
    tokens2 = scan(f2)

    #Call to merge and search
    merged = merge(tokens1,tokens2)
    searchMerge(name,merged)




main()

好的。所以这就是问题所在。我们要将两个列表合并成一个排序的主列表,在 ---'s 处分隔

我的两个日志文件与我在上面链接到的网站上发布的文件相匹配。此代码有效,但是如果每个列表中有两个以上的 --- 实例,它将不会跳转到下一个列表以获取其他标记,依此类推。我有两个使用合并功能。在该函数结束时我返回

return(log1Parse[0] + log2Parse[0] + log1Parse[1] + log2Parse[1])

但这仅适用于 --- 的两个实例。无论如何我可以更改我的返回以查看所有索引,而不必手动输入 [0]、[1]、[2] 等?我需要它来分隔和合并任意数量。请帮忙!!

附言无视菜鸟...我是新手,我们都得从某个地方开始

p.p.s. - 从扫描仪导入扫描是我写的扫描仪,用于接收给定列表中的所有标记

【问题讨论】:

    标签: python-3.x custom-lists


    【解决方案1】:

    so.py:

    import sys
    
    def main():
        # check and load command line arguments
        # your code
        if len(sys.argv) != 4:
            print('Incorrect number of arguments, should be 3')
            sys.exit(1)
    
        # open files using file io
        # your code
        f1 = open(log1, 'r')
        f2 = open(log2, 'r')
    
        # list comprehension to process and filter log files
        l1 = [ x.strip().split(" ",2) for x in f1.readlines() if x.strip() != "---" ]
        l2 = [ x.strip().split(" ",2) for x in f2.readlines() if x.strip() != "---" ]
    
        f1.close()
        f2.close()
    
        sorted_merged_lists = sorted(l1 + l2)
    
        results = [ x for x in sorted_merged_lists if x[1] == name ]
    
        for result in results:
            print result
    
    main()
    

    CLI:

    $ python so.py log1.txt log2.txt Matt
    ['12:06:12', 'Matt', 'Logged In']
    ['13:30:07', 'Matt', 'Opened Terminal']
    ['15:02:00', 'Matt', 'Opened Evolution']
    ['15:31:16', 'Matt', 'Logged Out']
    

    文档:

    http://docs.python.org/release/3.0.1/tutorial/datastructures.html#list-comprehensions
    http://docs.python.org/release/3.0.1/library/stdtypes.html?highlight=strip#str.strip
    http://docs.python.org/release/3.0.1/library/stdtypes.html?highlight=split#str.split
    http://docs.python.org/release/3.0.1/library/functions.html?highlight=sorted#sorted

    【讨论】:

    • 非常感谢您的快速回复,但是我需要将所有内容输出为: 12:06:12 Matt Logged In 13:30:07 Matt Opened Terminal 15:02:00 Matt Opened Evolution 15:31:16 马特退出
    • 我打算回去编辑代码,但看看我在底部链接的文档。用空格将列表重新加入:for 循环中的print " ".join(result) 应该为您提供您正在寻找的格式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2019-05-10
    相关资源
    最近更新 更多