path = defaultdict(lambda: defaultdict(lambda: INF))
时间: 2024-08-13 09:08:03 浏览: 80
`path` 是一个使用 `defaultdict` 定义的数据结构,它在 Python 中通常用于图算法中的最短路径搜索。`defaultdict` 是一个内置类,它为容器提供了一个默认值,当你尝试访问一个不存在的键时,它会自动创建并返回这个默认值。
在这个上下文中,`INF` 可能代表无穷大(Infinity),通常是用来表示一个路径长度未确定或者是最长路径的初始值。`lambda: INF` 是一个匿名函数,它定义了当键不存在时的默认值。所以,`path[key][value]` 会返回两个键(如城市名)之间的最短路径长度,如果路径尚未计算,`path[key]` 的默认值就是 `INF`。
具体操作如下:
```python
from collections import defaultdict
# 初始化一个默认值为无穷大的字典
path = defaultdict(lambda: defaultdict(lambda: float('inf')))
# 当你想要查找从城市A到城市B的路径时,例如
path['A']['B'] # 如果路径已知,返回路径长度;否则返回无穷大
# 如果路径未知,可以设置一个初始路径
path['A']['B'] = 10 # 假设从A到B的路径长度为10
# 如果查询一个不存在的中间节点C,会返回默认值
path['A']['C'] # 默认为无穷大,直到找到实际路径
```
相关问题
import time import csv import pandas as pd from selenium import webdriver from selenium.webdriver import Chrome,ChromeOptions from selenium.webdriver.common.by import By # driver_path = r'C:\Program Files\Google\Chrome\Application\chrome.exe' driver = webdriver.Chrome() driver.get('https://www.jd.com/') def drop_down(): for x in range(1,9,2): time.sleep(1) j = x /9 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j driver.execute_script(js) driver.find_element(By.CSS_SELECTOR,'#key').send_keys('燕麦') driver.find_element(By.CSS_SELECTOR,'.button').click() f = open(f'B:\京东商品数据.csv', mode='a', encoding='gbk', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '商品标题', '商品价格', '店铺名字', '标签', '商品详情页', ]) csv_writer.writeheader() 商品信息 = [] def get_shop(): time.sleep(10) # driver.implicitly_wait(10) drop_down() lis = driver.find_elements(By.CSS_SELECTOR,'#J_goodsList ul li') for li in lis: title = li.find_element(By.CSS_SELECTOR,'.p-name em').text.replace('\n', '') price = li.find_element(By.CSS_SELECTOR,'.p-price strong i').text shop_name = li.find_element(By.CSS_SELECTOR,'.J_im_icon a').text href = li.find_element(By.CSS_SELECTOR,'.p-img a').get_attribute('href') icons = li.find_elements(By.CSS_SELECTOR,'.p-icons i') icon = ','.join([i.text for i in icons]) dit = { '商品标题':title, '商品价格':price, '店铺名字':shop_name, '标签':icon, '商品详情页':href, } csv_writer.writerow(dit) # print(title,price,href,icon,sep=' | ') for page in range(1,3): time.sleep(1) drop_down() get_shop() driver.find_element(By.CSS_SELECTOR,'.pn-next').click() driver.quit() # data = csv.reader(open('B:\京东商品数据.csv'),delimiter=',') # sortedl = sorted(data,key=lambda x:(x[0],x[1]),reverse=True) # print('最贵的商品信息') # print(sortedl) # with open('B:\京东商品数据.csv','r',encoding='gbk') as f: # f_csv = csv.reader(f) # max_price = 0 # next(f_csv) # for row in f_csv: # if row[1].isdigit() and int(row[1]) > max_price: # max_price = int(row[1]) # print(max_price) with open('B:\京东商品数据.csv', 'r') as file: reader = csv.reader(file) header =next(reader) next(reader) max_price = float('-inf') for row in reader: num = float(row[1]) if num > max_price: max_price = num item = row[0] name_0= row[2] print(item,max_price,name_0)程序中出现ValueError: could not convert string to float: '商品价格'解决方法
在这个程序中,您使用了csv模块来读取和写入CSV文件,但是当您尝试将字符串转换为浮点数时出现了ValueError。这是因为您尝试将一个非数字字符串('商品价格')转换为float类型。
要解决这个问题,您需要在读取文件之前跳过CSV文件的第一行(即标题行),该行包含列名。可以使用csv.reader()函数的next()方法来跳过标题行,例如:
```
with open('B:\京东商品数据.csv', 'r') as file:
reader = csv.reader(file)
header = next(reader) # 跳过标题行
max_price = float('-inf')
for row in reader:
num = float(row[1])
if num > max_price:
max_price = num
item = row[0]
name_0= row[2]
print(item, max_price, name_0)
```
注意,这里使用float('-inf')来初始化max_price,以确保第一个价格将始终大于它。还要注意,您需要在for循环中保存商品名称和店铺名称,以便在找到最大价格时打印它们。
Caused by: com.android.builder.merge.DuplicateRelativeFileException: 2 files found with path 'META-INF/androidx.vectordrawable_vectordrawable.version'. at com.android.builder.merge.StreamMergeAlgorithms.lambda$acceptOnlyOne$2(StreamMergeAlgorithms.java:75) at com.android.builder.merge.StreamMergeAlgorithms.lambda$select$3(StreamMergeAlgorithms.java:95) at com.android.builder.merge.IncrementalFileMergerOutputs$1.create(IncrementalFileMergerOutputs.java:88) ... 43 more
这个错误通常是由于在您的 Android 项目中引入了多个库,这些库中包含了相同的文件,导致冲突。在这种情况下,您可以尝试以下几种解决方法:
1. 排除冲突的库。在您的 app/build.gradle 文件中,可以使用 exclude 指令来排除特定库中的文件。例如,如果您的项目中同时引入了两个库,它们都包含了相同的文件,您可以使用如下代码来排除其中一个库中的文件:
```
android {
packagingOptions {
exclude 'META-INF/androidx.vectordrawable_vectordrawable.version'
}
}
```
2. 更新库版本。如果您的项目中引入的库版本过旧,可以尝试更新库版本。通常来说,新的库版本中会修复一些已知的问题和错误。
3. 删除重复文件。如果您的项目中只有几个文件重复,并且这些文件不是必需的,您可以手动删除其中一个文件,以避免冲突。
请注意,当您修改 app/build.gradle 文件时,请务必注意语法和格式的正确性,以免引入新的错误。而且,如果您排除了某个库中的文件,可能会导致该库无法正常工作。因此,请在排除文件之前仔细考虑您的需求。
阅读全文