从嵌套列表中获取单个值

时间:2018-11-05 11:07:05

标签: python

我目前正在尝试查找多个(〜580).csv文件之间的相似性。我要这样做的方式如下:

  1. 将所有文件放入存储在变量中的列表中
  2. 一个个打开每个文件
  3. 拆分每个文件,使每一行都是一个列表
  4. 从打开的文件中获取标题和数据,并将它们分别存储在自己的变量(标题和文件列表)中
  5. 使每个值都在子列表(?)中,该子列表代表一个唯一的文件。
  6. 创建一个循环,其中将每个文件与文件列表进行比较
  7. 如果步骤6找到与文件相似的值,请打印出文件名+值

文件列表(已完成步骤4)如下:

[['00000000B847912E,,1,1,1,1,1,1,1,1,1,1,ALG0,,1,1,1,1,1,1,1,1,1,1,<>Z*,,0,1,AUT-ANALYSE,0,0,1,25.10.2017, 09:38:42,0,0,1,3,1,1,1,1,1,1,1,1,0,0', ''], ['00000000B75B90E6,...

我陷入了第5步。知道如何完成该步骤吗?

当前代码如下:

from os import listdir, chdir
path = (r'C:\...')
chdir(path)
files = [f for f in listdir(path)]

class Dataset():

    def __init__(self, files):
        self.files = files

    def openfiles(self):
        self.filelist = []
        self.headers = []
        for file in self.files:
            if file.lower().endswith('.txt'):
                with open(file, 'r') as x:
                    x = x.read()
                    x = x.split('\n')
                    #y = [line.split(',') for line in x]
                    header = x[0]
                    data = x[1:]
                    self.filelist.append(data)
                    self.headers.append(header)

        return self.filelist  

    def uniquevalues(self):
        last = object()
        self.uniquefilelist = []
        self.openfiles()
        for file in self.filelist:
            for line in file:
                for value in line:
                    if value == last:
                        continue

                        self.uniquefilelist.append(item)
                        last = item



        return self.uniquefilelist

编辑所需的输出:如果我使用前面显示的列表,则所需的输出将如下所示:

[['00000000B847912E,1,ALG0,<>Z*,0,AUT-ANALYSE,25.10.2017, 09:38:42,3,''], ['00000000B75B90E6,...

edit 2:编辑帖子。在openfiles()中将y注释掉,因为它正在为文件中的每一行创建一个新列表。我认为这不会帮助我取得理想的结果

edit 3回答Novak:我把它放在这样的代码中:

def uniquevalues(self):
        self.uniquelist = []
        self.openfiles()
        for file in self.filelist:
            file = list(set(file))
            self.uniquelist.append(file)      

        return self.uniquelist 

输出仍然不是唯一的+在每个列表的开头都添加了''

[['','00000000B847912E,,1,1,1,1,1,1,1,1,1,1,ALG0,,1,1,1,1,1,1,1,1,1,1,<>Z*,,0,1,AUT-ANALYSE,0,0,1,25.10.2017, 09:38:42,0,0,1,3,1,1,1,1,1,1,1,1,0,0'], ['', '00000000B75B90EB,...

编辑4:我编写的函数:

def notonestring(self):
    self.openfiles()
    self.useddata = []
    for i in self.filelist:
        l = i.split(',')
        self.useddata.append(l)

    return self.useddata

输入是第4步中的列表

编辑5:代码:

for i in filelist:
    for j in range(len(i)):
        l = i[j].split(',')
        useddata.append(l)

输出(对于文件2):print(useddata[1])

['00000000B75B90E7', '2', '12.04.2017 08:48:00', '01.01.1754 10:48:26', 'LFR\\H.SIEPEL', '156', '62001', '1', '14', '15', 'Field1=0(ABO)', '1', 'ABO', '0', '', '0', '', '1', '0', 'Lefier']

一行。应该是7。它现在也从第二行而不是第一行开始。

1 个答案:

答案 0 :(得分:0)

您可以编写如下内容:

step_5_list = []
for i in step_4_list:
  for j in i:
    l = list(set(i))
    step_5_list.append(l)

之所以起作用,是因为set是仅保留唯一元素的数据结构。因此,您将列表变成集合,它只保留唯一元素,然后将其返回列表并追加到结果列表中。

此外,我看到每个子列表都以'开始和结束。这意味着您有一个包含一个字符串的列表。为了获得列表,您应该执行以下操作:

res = []
for i in step_4_sublist:
  l = i.split(',')
  res.append(l)

在此之后,您应该做我之前写的部分。

希望这对您有所帮助。如果仍然不清楚,请在评论中询问mi:)