Python列表从第二维度中选择,其中第一维度=条件

Python列表从第二维度中选择,其中第一维度=条件,python,list,search,Python,List,Search,假设我有一个2D值列表 [00000.ppm,11],[00001.ppm,40],[00001.ppm,38],[00001.ppm,13],[00002.ppm,39],[00003.ppm,4]] 我需要从列表的第二维度中选择每个值,其中file=“anything.ppm” 因此,当我搜索00001.ppm时,我将得到值“40”、“38”、“13”作为输出 我还需要将这些值分开,以便比较它们,例如 _class=13 if (value==_class): do something 我

假设我有一个2D值列表

[00000.ppm,11],[00001.ppm,40],[00001.ppm,38],[00001.ppm,13],[00002.ppm,39],[00003.ppm,4]]

我需要从列表的第二维度中选择每个值,其中file=“anything.ppm”

因此,当我搜索00001.ppm时,我将得到值“40”、“38”、“13”作为输出

我还需要将这些值分开,以便比较它们,例如

_class=13
if (value==_class): do something
我在想,除了昂贵的循环遍历整个列表之外,是否还有其他方法,因为事实上,文件是有序的,它们的名称总是整数增量

我只是不知道每个文件有多少个

也许将.csv文件读入列表是个坏主意

.csv格式

00000.ppm,11
00001.ppm,40
00001.ppm,38
00001.ppm,13
00002.ppm,39
00003.ppm,4

我不认为有一种方法可以在不通过数组循环的情况下做到这一点

您可以使用如中所示的方法

应该为您提供数组中元素的索引。然后您可以使用这些索引在第二列中获得相应的值:

my_list[i][1]

我不认为有一种方法可以在不通过数组循环的情况下做到这一点

您可以使用如中所示的方法

应该为您提供数组中元素的索引。然后您可以使用这些索引在第二列中获得相应的值:

my_list[i][1]
我在想,除了昂贵的循环,是否还有其他方法 通过整个列表,因为事实上,文件是有序的 它们的名称总是整数增量

不必将整个数据集读取到一个列表并对其进行传递,您可以利用文件对象是可编辑的这一事实,并在从00001转换到00002时停止读取

def read_partial(file, key='00001.ppm'):
    with open('obj.csv') as f:
        found = False
        for line in f:
            if line.startswith(key):
                yield int(line.split(',')[-1].strip())
                found = True
            else:
                if found:
                    break 



>>> list(read_partial('obj.csv'))
[40, 38, 13]
同样,这假设0000x.ppm字段的排序与您的问题相同

obj.csv:

00000.ppm,11
00001.ppm,40
00001.ppm,38
00001.ppm,13
00002.ppm,39
00003.ppm,4
如果您确实想在列表上进行迭代,可以使用
[b代表a,如果a=='00001.ppm']
在mylist中使用b

我在想,除了昂贵的循环,是否还有其他方法 通过整个列表,因为事实上,文件是有序的 它们的名称总是整数增量

不必将整个数据集读取到一个列表并对其进行传递,您可以利用文件对象是可编辑的这一事实,并在从00001转换到00002时停止读取

def read_partial(file, key='00001.ppm'):
    with open('obj.csv') as f:
        found = False
        for line in f:
            if line.startswith(key):
                yield int(line.split(',')[-1].strip())
                found = True
            else:
                if found:
                    break 



>>> list(read_partial('obj.csv'))
[40, 38, 13]
同样,这假设0000x.ppm字段的排序与您的问题相同

obj.csv:

00000.ppm,11
00001.ppm,40
00001.ppm,38
00001.ppm,13
00002.ppm,39
00003.ppm,4

如果您确实想在列表上进行迭代,那么可以使用
[b表示a,如果a=='00001.ppm',则在mylist中使用b

听起来你想得到一个与特定文件名对应的所有值的列表。如果你没有很多项和/或你想检查所有的文件名,那么最好的办法可能是使用for循环将字典中所有相关的值分组在一起。但是如果你有一个很长的、已排序的项列表,并且只需检查几个文件名,就可以使用
对分
模块快速搜索列表

下面的代码给出了这两种方法的示例

entries = [
    ['00000.ppm', 11],
    ['00001.ppm', 40], ['00001.ppm', 38], ['00001.ppm', 13],
    ['00002.ppm', 39],
    ['00003.ppm', 4]
]

# good for most cases:
values = dict()
for filename, value in entries:
    values.setdefault(filename, []).append(value)

print(values['00001.ppm'])
# [40, 38, 13]
# not clear what you want to do with these next...

# this method searches within a sorted list.
# it will be useful if there are many items in the entries list (> ~100000) 
# and you only need to lookup a few
import bisect
def find_values(entries, filename):
    starting_search_key = [filename, -1]
    i = bisect.bisect_left(entries, starting_search_key)
    values = []
    while i < len(entries) and entries[i][0] == filename:
        values.append(entries[i][1])
        i += 1
    return values

print(find_values(entries, '00001.ppm'))
# [40, 38, 13]

如果您有一个巨大的csv文件,只需要进行一些搜索,您可以使用对分算法快速搜索,而无需读取大部分文件。但您可能需要自己实现该算法,而不是使用对分模块。您必须打开该文件,然后使用
file.seek()
跳转到中间,然后向前扫描,直到到达回车符,然后检查下一个文件名是否小于您要查找的文件名。如果是,请向前跳一半;如果不是,请向后跳一半。重复此操作,直到找到您感兴趣的文件名。但这有复杂的边缘情况,除非您有非常详细的说明,否则我不会继续使用它大型csv文件,只需对其进行几次搜索。更好的选择是使用数据库和/或Dask软件包。

听起来您希望获得与特定文件名对应的所有值的列表。如果您没有很多项和/或您希望检查所有文件名,那么您最好使用for loop可将字典中的所有相关值组合在一起。但是,如果您有一个非常长的已排序项目列表,并且您只想检查少数文件名,则可以使用
对分
模块快速搜索列表

下面的代码给出了这两种方法的示例

entries = [
    ['00000.ppm', 11],
    ['00001.ppm', 40], ['00001.ppm', 38], ['00001.ppm', 13],
    ['00002.ppm', 39],
    ['00003.ppm', 4]
]

# good for most cases:
values = dict()
for filename, value in entries:
    values.setdefault(filename, []).append(value)

print(values['00001.ppm'])
# [40, 38, 13]
# not clear what you want to do with these next...

# this method searches within a sorted list.
# it will be useful if there are many items in the entries list (> ~100000) 
# and you only need to lookup a few
import bisect
def find_values(entries, filename):
    starting_search_key = [filename, -1]
    i = bisect.bisect_left(entries, starting_search_key)
    values = []
    while i < len(entries) and entries[i][0] == filename:
        values.append(entries[i][1])
        i += 1
    return values

print(find_values(entries, '00001.ppm'))
# [40, 38, 13]

如果您有一个巨大的csv文件,只需要进行一些搜索,您可以使用对分算法快速搜索,而无需读取大部分文件。但您可能需要自己实现该算法,而不是使用对分模块。您必须打开该文件,然后使用
file.seek()
跳转到中间,然后向前扫描,直到到达回车符,然后检查下一个文件名是否小于您要查找的文件名。如果是,请向前跳一半;如果不是,请向后跳一半。重复此操作,直到找到您感兴趣的文件名。但这有复杂的边缘情况,除非您有非常详细的说明,否则我不会继续使用它大型csv文件,只需对其进行几次搜索。更好的选择是使用数据库和/或Dask软件包。

听起来您希望获得与特定文件名对应的所有值的列表。文件名和值列表中是否有超过100000项?如果是,您是否只搜索其中的几项e文件名?如果两者的答案都是“是”,则您可能希望使用“对分”模块来搜索原始列表。如果其中任何一个的答案都是“否”,则您最好使用
for
循环来构建字典,其中键是文件名,值是匹配值的列表。然后您可以只读取va列表根据需要从那本字典中提取。听起来你好像想得到一份所有信息的列表