我有兩個串列如下:
x = [1, "A", 2, "B", 3, "C", 4, "D"]
y = [1, "Value1", 1, "Value2", 2, "Value3", 3, "Value4", 3, "Value5", 4, "Value6", 4, "Value7"]
我要創建的輸出是具有兩個值的元組串列,如下所示:
xy_merge = [("A", "Value1"), ("A", "Value2"),
("B", "Value3"),
("C", "Value4"), ("C", "Value5"),
("D", "Value6"), ("D", "Value7")]
我通過使用簡單的陳述句嘗試了多種方法,但都無法獲得所需的輸出。請幫助獲得此輸出。
uj5u.com熱心網友回復:
嘗試:
m = dict(zip(x[::2], x[1::2]))
out = [(m[a], b) for a, b in zip(y[::2], y[1::2])]
print(out)
印刷:
[('A', 'Value1'), ('A', 'Value2'), ('B', 'Value3'), ('C', 'Value4'), ('C', 'Value5'), ('D', 'Value6'), ('D', 'Value7')]
uj5u.com熱心網友回復:
x = [1, "A", 2, "B", 3, "C", 4, "D"]
y = [1, "Value1", 1, "Value2", 2, "Value3", 3, "Value4", 3, "Value5", 4, "Value6", 4, "Value7"]
def pairwise(iterable):
yield from zip(*[iter(iterable)]*2)
to_x = dict(pairwise(x))
xy_merge = [(to_x[key], value) for key, value in pairwise(y)]
print(xy_merge)
輸出:
[('A', 'Value1'), ('A', 'Value2'), ('B', 'Value3'), ('C', 'Value4'), ('C', 'Value5'), ('D', 'Value6'), ('D', 'Value7')]
>>>
pairwise是一個生成器,它在每次迭代中產生一個可迭代物件的下兩項。如果你在 x 上成對迭代,你會得到:
(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')
我們可以to_x從這些元組構造一個字典,將整數映射到字母:
to_x = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
要生成xy_merge,您y需要成對地迭代,并且對于每次迭代,將整數映射到 中的一個字母to_x。
uj5u.com熱心網友回復:
與先前的答案非常相似,但更簡單:
x = [1, "A", 2, "B", 3, "C", 4, "D"]
y = [1, "Value1", 1, "Value2", 2, "Value3", 3, "Value4", 3, "Value5", 4, "Value6", 4, "Value7"]
# yields adjacent pairs from the given list
def getp(lst):
for i in range(0, len(lst), 2):
yield lst[i], lst[i 1]
# convert x to a dictionary
dx = {x[i]: x[i 1] for i in range(0, len(x), 2)}
# build list of tuples
yl = [(dx[i], v) for i, v in getp(y)]
print(yl)
輸出:
[('A', 'Value1'), ('A', 'Value2'), ('B', 'Value3'), ('C', 'Value4'), ('C', 'Value5'), ('D', 'Value6'), ('D', 'Value7')]
uj5u.com熱心網友回復:
這是一個解決方案。
import itertools
x = [1, "A", 2, "B", 3, "C", 4, "D"]
y = [1, "Value1", 1, "Value2", 2, "Value3", 3, "Value4", 3, "Value5", 4, "Value6", 4, "Value7"]
keys_x = set([x[2*i] for i in range(len(x) // 2)])
keys_y = set([y[2*i] for i in range(len(y) // 2)])
keys_merge = keys_x.intersection(keys_y)
dict_x = {
key: [] for key in keys_x
}
for i in range(len(x) // 2):
dict_x[x[2*i]].append(x[2*i 1])
dict_y = {
key: [] for key in keys_y
}
for i in range(len(y) // 2):
dict_y[y[2*i]].append(y[2*i 1])
xy_merge = []
for key in keys_merge:
xy_merge.extend(
list(itertools.product(dict_x[key], dict_y[key]))
)
print(xy_merge)
這列印出來:
[('A', 'Value1'), ('A', 'Value2'), ('B', 'Value3'), ('C', 'Value4'), ('C', 'Value5'), ('D', 'Value6'), ('D', 'Value7')]
請注意,如果您想保留順序,請嘗試使用list而不是setfor 鍵。
uj5u.com熱心網友回復:
dx, dy = {}, {}
for i in range(0, len(x), 2): dx.setdefault(x[i], []).append(x[i 1])
for i in range(0, len(y), 2): dy.setdefault(y[i], []).append(y[i 1])
[(vx, vy) for k in dy.keys() for vy in dy[k] for vx in dx[k]]
# [('A', 'Value1'),
# ('A', 'Value2'),
# ('B', 'Value3'),
# ('C', 'Value4'),
# ('C', 'Value5'),
# ('D', 'Value6'),
# ('D', 'Value7')]
uj5u.com熱心網友回復:
所以這個問題有熊貓標簽,熊貓可能是這樣的:
df_x = pd.DataFrame(zip(x[::2],x[1::2]))
df_y = pd.DataFrame(zip(y[::2],y[1::2]))
df_xy = pd.merge(df_x,df_y, on=0)
xy_merge = df_xy[['1_x','1_y']].apply(tuple, axis=1).tolist()
print(xy_merge)
'''
[('A', 'Value1'),
('A', 'Value2'),
('B', 'Value3'),
('C', 'Value4'),
('C', 'Value5'),
('D', 'Value6'),
('D', 'Value7')]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441614.html
標籤:Python python-3.x 熊猫 列表 数据框
上一篇:如何回傳串列中值的第一個位置?
下一篇:計算串列元素的平均值
