在Python中迭代两个列表

3

我有一个文件名列表,是用dirs = os.listdir(dir/path)创建的。

同时,我从csv文件中导出了数据集。stocks = csv.reader(open('config.csv', 'rb'))

股票数据示例:

fileName1,url1

fileName2,url2

我需要在Python脚本中获取dirs列表中每个文件的url。谢谢提前。


“get each url” 是什么意思?你要发起一个网络请求吗? - aIKid
好的,所以您想要从“stocks”中获取所有文件名出现在“dirs”中的条目? - EarlGrey
2个回答

6

Python提供了一个内置函数来实现这个功能,zip

for dir, stock, in zip(dirs, stocks)

示例:

>>> a = ["cat", "dogs"]
>>> b = ["http://cat-service.com", "http://dogs-care.com"]
>>> for animal, site in zip(a, b):
    print(animal, site)


cat http://cat-service.com
dogs http://dogs-care.com

看,这并不难,对吧?Python让我们的生活更加容易!:)

另一种方法:如果性能真的很重要,使用itertools.izip

更新

结果发现上面的答案并不是OP想要的。好吧,和Steve一样,我会用字典来解决这个问题:

stock_dict = dict(stock)
urls = [stock_dict.get(file, "Not found") for file in dirs]

演示:

我们假设目录中有3个文件,其中两个已被列出。

>>> stock = [("fileName1","url1"), ("fileName2","url2")]
>>> stock_dict = dict(stock)
>>> dirs = ["fileName1", "fileName2", "fileName3"]
>>> urls = [stock_dict.get(file, "Not found") for file in dirs]
>>> urls
['url1', 'url2', 'Not found']

希望这有所帮助!

我认为这不是@Yasitha想要的。如果路径中有fileName1、fileName3但没有fileName2,那么你的代码就无法正常工作。 - EarlGrey
感谢您的回答。我要找的是当文件名与股票数据中的名称匹配时获取URL。例如:假设目录中有一个名为“file1”的记录,我想遍历股票数据,并且如果有一个与file1的记录匹配,则获取该URL。需要为dirs中的所有元素执行此操作。 - Yasitha

2

假设所有内容都适合内存:

stockslookup = dict(stocks)
urls = [stockslookup[filename] for filename in dirs]

请注意,文件名必须完全相同,因此您可能需要在两者上使用os.path.abspath(或os.path.normpath)。

这是一个不错的方法。我一开始想用列表推导式来做,但这种方式更聪明! - EarlGrey
1
如果这两个列表都是有序的,那么你可以执行一个类似于归并的操作,时间复杂度为 O(n+m),空间复杂度为 O(1)(如果你假设文件名长度有固定上限的话,"ish" 就变成了实际值)。但是如果你拥有足够的内存预算的话,使用 dict 是查找任何东西的“显而易见”的方法 :-) - Steve Jessop
我其实有点困惑原帖提出了什么问题。 - aIKid
@alKid:我认为问题中的“样本股票数据”是config.csv文件的内容,并且请求是查找文件中的每个文件名以获取其对应的URL。但是,如果我错了,那么我的代码就是错误的 :-) - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接