![](/img/trans.png)
[英]Exactly same Python Program when tested in "Run Code" and "Submit" gives two different outputs on LeetCode
[英]Same python code block gives different outputs at different time
我想创建一个单词词典。 字典看起来像
words_meanings= {
"rekindle": "relight",
"pesky":"annoying",
"verge": "border",
"maneuver": "activity",
"accountability":"responsibility",
}
keys_letter=[]
for x in words_meanings:
keys_letter.append(x)
print(keys_letter)
输出: rekindle , pesky, verge, maneuver, accountability
在这里, rekindle , pesky, verge, maneuver, accountability
是关键,而relight, annoying, border, activity, responsibility
是价值。
现在我想创建一个 csv 文件,我的代码将从文件中获取输入。
该文件看起来像
rekindle | pesky | verge | maneuver | accountability
relight | annoying| border| activity | responsibility
到目前为止,我使用此代码加载文件并从中读取数据。
from google.colab import files
uploaded = files.upload()
import pandas as pd
data = pd.read_csv("words.csv")
data.head()
import csv
reader = csv.DictReader(open("words.csv", 'r'))
words_meanings = []
for line in reader:
words_meanings.append(line)
print(words_meanings)
这是print(words_meanings)
的输出
[OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]
对我来说看起来很奇怪。
keys_letter=[]
for x in words_meanings:
keys_letter.append(x)
print(keys_letter)
现在我创建了一个空列表并且只想附加键值。 但输出是[OrderedDict([('\rekindle', 'relight'), ('pesky', 'annoying')])]
我很困惑。 根据第一个代码块,它只包含键,但现在它同时包含键和它们的值。 我怎样才能克服这种情况?
我建议您使用同一行上的键和值来格式化 csv。 像这样
rekindle,relight
pesky,annoying
verge,border
这样下面的代码就可以工作了。
words_meanings = {}
with open(file_name, 'r') as file:
for line in file.readlines():
key, value = line.split(",")
word_meanings[key] = value.rstrip("\n")
如果你想要一个键列表: list_of_keys = list(word_meanings.keys())
向文件中添加键和值:
def add_values(key:str, value:str, file_name:str):
with open(file_name, 'a') as file:
file.writelines(f"\n{key},{value}")
key = input("Input the key you want to save: ")
value = input(f"Input the value you want to save to {key}:")
add_values(key, value, file_name)```
您运行相同的代码块,但将其用于不同的对象,这会产生不同的结果。
首先你使用普通字典(检查type(words_meanings)
)
words_meanings = {
"rekindle": "relight",
"pesky":"annoying",
"verge": "border",
"maneuver": "activity",
"accountability":"responsibility",
}
和for
-loop 为您提供这本字典中的keys
你可以得到同样的
keys_letter = list(words_meanings.keys())
甚至
keys_letter = list(words_meanings)
稍后您在此列表中使用带有单个字典的列表(检查type(words_meanings)
)
words_meanings = [OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]
和for
-loop 为您提供此列表中的元素,而不是此列表中字典中的键。 因此,您将完整字典从一个列表移动到另一个列表。
你可以得到同样的
keys_letter = words_meanings.copy()
甚至一样
keys_letter = list(words_meanings)
from collections import OrderedDict
words_meanings = {
"rekindle": "relight",
"pesky":"annoying",
"verge": "border",
"maneuver": "activity",
"accountability":"responsibility",
}
print(type(words_meanings))
keys_letter = []
for x in words_meanings:
keys_letter.append(x)
print(keys_letter)
#keys_letter = list(words_meanings.keys())
keys_letter = list(words_meanings)
print(keys_letter)
words_meanings = [OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]
print(type(words_meanings))
keys_letter = []
for x in words_meanings:
keys_letter.append(x)
print(keys_letter)
#keys_letter = words_meanings.copy()
keys_letter = list(words_meanings)
print(keys_letter)
csv
模块的默认字段分隔符是逗号。 您的 CSV 文件使用竖线或条形符号|
,并且这些字段似乎也是固定宽度的。 所以,你需要指定|
作为创建 CSV 阅读器时使用的分隔符。
此外,您的 CSV 文件被编码为 Big-endian UTF-16 Unicode 文本 (UTF-16-BE)。 该文件包含一个字节顺序标记 (BOM),但 Python 并未将其剥离,因此您会注意到字符串'\rekindle'
包含 FEFF UTF-16-BE BOM。 这可以通过在打开文件时指定encoding='utf16'
来解决。
import csv
with open('words.csv', newline='', encoding='utf-16') as f:
reader = csv.DictReader(f, delimiter='|', skipinitialspace=True)
for row in reader:
print(row)
在你的 CSV 文件上运行这个会产生这个:
{'rekindle ': 'relight ', 'pesky ': 'annoying', 'verge ': 'border', 'maneuver ': 'activity ', 'accountability': 'responsibility'}
请注意,键和值中有尾随空格。 skipinitialspace=True
删除了前导空格,但没有删除尾随空格的选项。 这可以通过从 Excel 导出 CSV 文件而不指定字段宽度来解决。 如果这不能完成,那么可以通过使用生成器预处理文件来修复它:
import csv
def preprocess_csv(f, delimiter=','):
# assumes that fields can not contain embedded new lines
for line in f:
yield delimiter.join(field.strip() for field in line.split(delimiter))
with open('words.csv', newline='', encoding='utf-16') as f:
reader = csv.DictReader(preprocess_csv(f, '|'), delimiter='|', skipinitialspace=True)
for row in reader:
print(row)
现在输出剥离的键和值:
{'rekindle': 'relight', 'pesky': 'annoying', 'verge': 'border', 'maneuver': 'activity', 'accountability': 'responsibility'}
因为我发现没有人能够帮助我回答。 最后,我在这里发布答案。 希望这会帮助其他人。
import csv
file_name="words.csv"
words_meanings = {}
with open(file_name, newline='', encoding='utf-8-sig') as file:
for line in file.readlines():
key, value = line.split(",")
words_meanings[key] = value.rstrip("\n")
print(words_meanings)
这是将 csv 传输到字典的代码。 享受!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.