Python列表从第二维度中选择,其中第一维度=条件
假设我有一个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”作为输出 我还需要将这些值分开,以便比较它们,例如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 我
_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列表根据需要从那本字典中提取。听起来你好像想得到一份所有信息的列表