由于字典未排序,因此输出也未订购:
>>> d = dict(b = 1, a = 2, z = 3)
>>> d.keys()
['a', 'z', 'b']
>>> d.values()
[2, 3, 1]
Run Code Online (Sandbox Code Playgroud)
但上面的输出keys和values输出总是按相应的顺序排列吗?
我有这些代码,我需要按照这个确切的顺序打印出来(访客团队,访客评分,主页团队,家庭评级,预期获胜者,保证金)tabulate.
final_dict = {'Visitor Team': visitor_team, 'Visitor Rating': visitor_rating, 'Home Team': home_team,
'Home Rating': home_rating, 'Expected Winner': expected_winner, 'Margin': expected_winner_diff}
print(tabulate(final_dict, headers="keys", floatfmt=".2f", tablefmt="fancy_grid"))
Run Code Online (Sandbox Code Playgroud)
我一直在学习和使用Python 3.6,而且我不知道,3.6中的dicts现在已经订购了,所以这实际上按照我的意图打印出来.这只是愚蠢的运气我想Python 3.6给了我我所需要的!
但我去另一台计算机上安装Python 3.5,这不会像我想的那样打印出来.我一直在阅读有关订单,但我不确定如何使用它.我是否需要首先将final_dict声明为空,然后迭代到我需要的关键顺序?
我正在阅读@Martijn Pieters对将dict转换为OrderedDict的回应.他的回答的主要观点是,通过一个普通的字典OrderedDict()将不会保留所需的顺序,因为你传递的字典已经"丢失"了任何相似的顺序.他的解决方案是传递组成dict的键/值对的元组.
但是,我在文档中也注意到以下内容:
在版本3.6中更改:接受PEP 468后,将保留传递给OrderedDict的关键字参数的顺序
这是否会使Martijn指出的问题无效(你现在可以将一个字典传递给OrderedDict),还是我误解了?
from collections import OrderedDict
ship = {'NAME': 'Albatross',
'HP':50,
'BLASTERS':13,
'THRUSTERS':18,
'PRICE':250}
print(ship) # order lost as expected
{'BLASTERS': 13, 'HP': 50, 'NAME': 'Albatross', 'PRICE': 250, 'THRUSTERS': 18}
print(OrderedDict(ship)) # order preserved even though a dict is passed?
OrderedDict([('NAME', 'Albatross'),
('HP', 50),
('BLASTERS', 13),
('THRUSTERS', 18),
('PRICE', 250)])
Run Code Online (Sandbox Code Playgroud)
如果我for key in ...在OrderedDict上运行一个循环,我得到同样的(正确的)顺序,似乎暗示可以传递dict本身.
编辑:这也引起了我的困惑:是否在Python 3.6+中订购了字典?
我有一个要从 DataFrame 中获取的列名列表。
添加单个Pandas列是显而易见的:Pandas: Add column if does not exist ,但我正在寻找一种有效且清晰的方法来添加多个列(如果它们不存在)。
d = {'a': [1, 2], 'b': [3, 4], 'c': [5,6], 'd': [7,8]}
df = pd.DataFrame(d)
df
a b c d
0 1 3 5 7
1 2 4 6 8
requested_cols = ['a','b','x','y','z']
Run Code Online (Sandbox Code Playgroud)
我试过类似的东西:
valid_cols = df.columns.values
missing_col_names = [col_name for col_name in requested_cols if col_name not in valid_cols]
df = df.reindex(list(df) + missing_col_names, axis=1).fillna(0)
df = df.loc[:,df.columns.isin(valid_cols)]
df = …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决属于我的基因组比对项目一部分的问题。问题如下:如果给定一个嵌套列表
y = [[1,2,3],[1,2,3],[3,4,5],[6,5,4],[4,2,5],[4,2,5],[1,2,8],[1,2,3]]
再次将唯一列表的索引提取到嵌套列表中。
例如,上面嵌套列表的输出应该是
[[0,1,7],[2],[3],[4,5],[6]].
这是因为列表[1,2,3]存在于0,1,7th索引位置、[3,4,5]第二索引位置等。
由于我将处理大型列表,那么在 Python 中实现这一目标的最佳方法是什么?
在 Python 3.7+ 中,dict文字是否保持其键的顺序?例如,是否保证{1: "one", 2: "two"}在迭代时总是以这种方式(1,然后 2)对其键进行排序?(Python 邮件列表中有一个主题类似的线程,但它涉及各个方向,我找不到答案。)
同样,字典是否像dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])列表中的有序?
同样的问题也适用于其他自然排序的结构,例如 dict comprehension 和dict(sape=4139, guido=4127, jack=4098).
PS:据记载,字典保留了插入顺序。因此,该问题基本上问:是它保证数据被插入在一个字典字面的顺序,列表的给予dict()等
我想知道如何在没有第一个和最后一个元素的情况下遍历 Python 字典。我的键不是从 1 开始的,所以我不能使用 len(capitals)
>>> capitals = {'15':'Paris', '16':'New York', '17':'Berlin', '18':'Brasilia', '19':'Moscou'}
>>> for city in capitals:
>>> print(city)
Paris
New York
Berlin
Brasilia
Moscou
Run Code Online (Sandbox Code Playgroud)
我想要这样的结果:
New York
Berlin
Brasilia
Run Code Online (Sandbox Code Playgroud)
我的键不是从 1 开始的,所以我不能使用 len(capitals)
这是以下问题:
main_module.py
from collections import OrderedDict
from my_other_module import foo
a = OrderedDict([
('a', 1),
('b', 2),
('c', 3),
('d', 4),
])
foo(**a)
Run Code Online (Sandbox Code Playgroud)
my_other_module.py
def foo(**kwargs):
for k, v in kwargs.items():
print k, v
Run Code Online (Sandbox Code Playgroud)
当我运行时,main_module.py我希望按照我指定的顺序打印输出:
a 1
b 2
c 3
d 4
Run Code Online (Sandbox Code Playgroud)
但相反,我得到:
a 1
c 3
b 2
d 4
Run Code Online (Sandbox Code Playgroud)
我确实理解这与**操作符的实现方式有关,并且它以某种方式丢失了字典对传入的顺序.我也明白python中的字典不是按列表排序的,因为它们是作为哈希表实现的.是否有任何类型的"黑客"我可以应用,所以我得到了在这种情况下所需的行为?
PS - 在我的情况下,我无法对foo函数内的字典进行排序,因为除了传递值的严格顺序之外,没有可遵循的规则.
我的理解是列表是一个连续的内存位置块,它包含指向内存中元素值的指针.如下所示:
我的问题是它是否与内存中的对象相同,即:假设我有一个带有init方法的point类,如下所示:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
我创建了一个新的点对象:
p = Point(4,6)
Run Code Online (Sandbox Code Playgroud)
指针p.x和指针是否p.y会在内存中彼此相邻?
我有两个示例列表,
vals = ["a", "c", "d", "e", "f", "g"]
xor = ["c", "g"]
Run Code Online (Sandbox Code Playgroud)
我想vals根据xor列表对列表进行排序,即,中的值xor应按vals确切顺序排在列表的首位。中存在的其余值vals应保持相同的顺序。
此外,在这些情况下,值xor可能不在,vals只是忽略这些值。而且,在重复的情况下,我只需要一个值。
期望的输出:
vals = ["c", "g", "a", "d", "e", "f"]
# here a, d, e, f are not in xor so we keep them in same order as found in vals.
Run Code Online (Sandbox Code Playgroud)
我的方法:
new_list = []
for x in vals:
for y in xor:
if x == y:
new_list.append(x)
for x in vals: …Run Code Online (Sandbox Code Playgroud) python ×10
dictionary ×6
python-3.6 ×2
python-3.x ×2
indices ×1
literals ×1
loops ×1
nested-lists ×1
object ×1
pandas ×1
performance ×1
python-3.5 ×1
python-3.7 ×1