如何合并两个列表?保留相同的列表元素以进行集合操作

蒙施

我一直在画维恩图,编码循环和不同的集合(symmetrical_differences,并集,交集,isdisjoint),在一两天的大部分时间里用行号枚举,试图找出如何在代码中实现这一点。

a = [1, 2, 2, 3] # <-------------|
b = [1, 2, 3, 3, 4] # <----------| Do not need to be in order.
result = [1, 2, 2, 3, 3, 4] # <--|

要么:

A = [1,'d','d',3,'x','y']
B = [1,'d',3,3,'z']
result =  [1,'d','d',3,3,'x','y','z']

编辑:

不尝试做a + b= [1、2、2、2、2、3、3、3、4]

尝试做类似的事情:

a - b = [2]

b - a = [3,4]

a ∩ b = [1,2,3]

所以

[a - b] + [b - a] + a ∩ b = [1,2,2,3,3,4]?

我不确定在这里。

我有两个电子表格,每个电子表格都有几千行。我想按列类型比较两个电子表格。

我已经从每一列中创建了要比较/合并的列表。

def returnLineList(fn):
    with open(fn,'r') as f:
        lines = f.readlines()
    line_list = []
    for line in lines:
        line = line.split('\t')
        line_list.append(line)
    return line_list

def returnHeaderIndexDictionary(titles):
    tmp_dict = {}
    for x in titles:
        tmp_dict.update({x:titles.index(x)})
    return tmp_dict

def returnColumn(index, l):
    column = []
    for row in l:
        column.append(row[index])
    return column

def enumList(column):
    tmp_list = []
    for row, item in enumerate(column):
        tmp_list.append([row,item])
    return tmp_list

def compareAndMergeEnumerated(L1,L2):
    less = []
    more = []
    same = []
    for row1,item1 in enumerate(L1):
        for row2,item2 in enumerate(L2):
            if item1 in item2:
                count1 = L1.count(item1)
                count2 = L2.count(item2)
                dif = count1 - count2
                if dif != 0:
                    if dif < 0:
                        less.append(["dif:"+str(dif),[item1,row1],[item2,row2]])
                    if dif > 0:
                        more.append(["dif:"+str(dif),[item1,row1],[item2,row2]])
                else:
                    same.append(["dif:"+str(dif),[item1,row1],[item2,row2]])
                break
    return less,more,same,len(less+more+same),len(L1),len(L2)

def main():
    unsorted_lines = returnLineList('unsorted.csv')
    manifested_lines = returnLineList('manifested.csv')

    indexU = returnHeaderIndexDictionary(unsorted_lines[0])
    indexM = returnHeaderIndexDictionary(manifested_lines[0])

    u_j_column = returnColumn(indexU['jnumber'],unsorted_lines)
    m_j_column = returnColumn(indexM['jnumber'],manifested_lines)

    print(compareAndMergeEnumerated(u_j_column,m_j_column))

if __name__ == '__main__':
    main()

更新:

from collections import OrderedDict
A = [1,'d','d',3,'x','y']
B = [1,'d',3,3,'z']
M = A + B
R = [1,'d','d',3,3,'x','y','z']


ACount = {}
AL = lambda x: ACount.update({str(x):A.count(x)})
[AL(x) for x in A]

BCount = {}
BL = lambda x: BCount.update({str(x):B.count(x)})
[BL(x) for x in B]

MCount = {}
ML = lambda x: MCount.update({str(x):M.count(x)})
[ML(x) for x in M]


RCount = {}
RL = lambda x: RCount.update({str(x):R.count(x)})
[RL(x) for x in R]


print('^sym_difAB',set(A) ^ set(B)) # set(A).symmetric_difference(set(B))
print('^sym_difBA',set(B) ^ set(A)) # set(A).symmetric_difference(set(B))
print('|union    ',set(A) | set(B)) # set(A).union(set(B))
print('&intersect',set(A) & set(B)) # set(A).intersection(set(B))
print('-dif AB   ',set(A) - set(B)) # set(A).difference(set(B))
print('-dif BA   ',set(B) - set(A)) 
print('<=subsetAB',set(A) <= set(B)) # set(A).issubset(set(B))
print('<=subsetBA',set(B) <= set(A)) # set(B).issubset(set(A))
print('>=supsetAB',set(A) >= set(B)) # set(A).issuperset(set(B))
print('>=supsetBA',set(B) >= set(A)) # set(B).issuperset(set(A))

print(sorted(A + [x for x in (set(A) ^ set(B))]))
#[1, 3, 'd', 'd', 'x', 'x', 'y', 'y', 'z']

print(sorted(B + [x for x in (set(A) ^ set(B))]))
#[1, 3, 3, 'd', 'x', 'y', 'z', 'z']
cA = lambda y: A.count(y)
cB = lambda y: B.count(y)
cM = lambda y: M.count(y)
cR = lambda y: R.count(y)
print(sorted([[y,cA(y)] for y in (set(A) ^ set(B))]))
#[['x', 1], ['y', 1], ['z', 0]]

print(sorted([[y,cB(y)] for y in (set(A) ^ set(B))]))
#[['x', 0], ['y', 0], ['z', 1]]

print(sorted([[y,cA(y)] for y in A]))
print(sorted([[y,cB(y)] for y in B]))
print(sorted([[y,cM(y)] for y in M]))
print(sorted([[y,cR(y)] for y in R]))
#[[1, 1], [3, 1], ['d', 2], ['d', 2], ['x', 1], ['y', 1]]
#[[1, 1], [3, 2], [3, 2], ['d', 1], ['z', 1]]
#[[1, 2], [1, 2], [3, 3], [3, 3], [3, 3], ['d', 3], ['d', 3], ['d', 3], ['x', 1], ['y', 1], ['z', 1]]
#[[1, 1], [3, 2], [3, 2], ['d', 2], ['d', 2], ['x', 1], ['y', 1], ['z', 1]]

cAL = sorted([[y,cA(y)] for y in A])

在此处输入图片说明

更新:2

基本上我认为是时候该学习了:

它看起来像是聚合,分组和求和的组合。

亚伦·霍尔

经过进一步的审查(现在我已经在家中并尝试使用Python解释器),我了解到您正在尝试执行的操作,但这与删除重复项的标题相矛盾。我看到您正在将每个其他元素视为一个新的索引唯一项。

这在概念上类似于装饰,排序,未装饰模式,只是用“连接”或“设置操作”代替术语“排序”。

因此,这是一个设置,首先导入,itertools因此我们可以将每个相似的元素分组并将它们枚举为一组:

import itertools

def indexed_set(a_list):
    '''
    assuming given a sorted list, 
    groupby like items, 
    and index from 0 for each group
    return a set of tuples with like items and their index for set operations
    '''
    return set((like, like_index) for _like, like_iter in itertools.groupby(a_list)
                          for like_index, like in enumerate(like_iter))

稍后,我们需要将带有索引的集合转换回列表:

def remove_index_return_list(an_indexed_set):
    '''
    given a set of two-length tuples (or other iterables)
    drop the index and 
    return a sorted list of the items 
    (sorted by str() for comparison of mixed types)
    '''
    return sorted((item for item, _like_index in an_indexed_set), key=str)

最后,我们需要我们的数据(取自您提供的数据):

a = [1, 2, 2, 3] 
b = [1, 2, 3, 3, 4] 
expected_result = [1, 2, 2, 3, 3, 4]

这是我建议的用法:

a_indexed = indexed_set(a)
b_indexed = indexed_set(b)
actual_result = remove_index_return_list(a_indexed | b_indexed)

assert expected_result == actual_result

不会引发AssertionError,并且

print(actual_result)

印刷品:

[1, 2, 2, 3, 3, 4]

编辑:由于我使函数处理混合大小写,所以我想演示:

c = [1,'d','d',3,'x','y']
d = [1,'d',3,3,'z']
expected_result =  [1,'d','d',3,3,'x','y','z']
c_indexed = indexed_set(c)
d_indexed = indexed_set(d)
actual_result = remove_index_return_list(c_indexed | d_indexed)
assert actual_result == expected_result

而且我们看到的并没有我们所期望的完全一样,但是由于排序的缘故,结果非常接近:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> actual_result
[1, 3, 3, 'd', 'd', 'x', 'y', 'z']
>>> expected_result
[1, 'd', 'd', 3, 3, 'x', 'y', 'z']

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何解析列表中的两个元素以创建一个新元素

来自分类Dev

前两个列表,对相应元素进行操作

来自分类Dev

如何制作对两个或多个相同形状的嵌套列表进行操作的Python函数?

来自分类Dev

如何从Haskell的两个列表中提取相同的元素?

来自分类Dev

如何返回两个列表中相同元素的计数?

来自分类Dev

如何比较列表中的两个元素以找到最低价格?

来自分类Dev

如果两个元素相同,如何替换列表中的两个元素(Python)

来自分类Dev

如何合并两个列表python

来自分类Dev

如何合并左两个列表?

来自分类Dev

如何合并两个列表foreach?

来自分类Dev

将两个元素列表合并为一个元素相同但每个元素有两个变量的列表

来自分类Dev

两个列表之间的公共元素并保留两个列表中元素的顺序

来自分类Dev

合并两个相同长度的 Scala 列表,相同索引处的元素成为一个元素

来自分类Dev

合并两个重叠列表的Pythonic方法,保留顺序

来自分类Dev

按保留顺序随机合并两个列表

来自分类Dev

合并两个排序列表并保留顺序

来自分类Dev

按保留顺序随机合并两个列表

来自分类Dev

通过对具有相同索引的元素求和来合并两个列表不起作用

来自分类Dev

通过对具有相同索引的元素求和来合并两个列表不起作用

来自分类Dev

如何合并列表列表中的两个元素?

来自分类Dev

如何在larave中合并两个相同的集合

来自分类Dev

如何基于对象索引合并两个列表-保留属性?

来自分类Dev

合并两个列表,但保持相同的出现次数

来自分类Dev

R:合并两个具有相同列名的列表

来自分类Dev

元素相同的两个列表中的公共元素

来自分类Dev

如何比较两个列表元素?

来自分类Dev

合并两个列表

来自分类Dev

Python:将两个相同长度的列表进行元素连接

来自分类Dev

将两个列表合并为一个没有重复元素的保留顺序

Related 相关文章

  1. 1

    如何解析列表中的两个元素以创建一个新元素

  2. 2

    前两个列表,对相应元素进行操作

  3. 3

    如何制作对两个或多个相同形状的嵌套列表进行操作的Python函数?

  4. 4

    如何从Haskell的两个列表中提取相同的元素?

  5. 5

    如何返回两个列表中相同元素的计数?

  6. 6

    如何比较列表中的两个元素以找到最低价格?

  7. 7

    如果两个元素相同,如何替换列表中的两个元素(Python)

  8. 8

    如何合并两个列表python

  9. 9

    如何合并左两个列表?

  10. 10

    如何合并两个列表foreach?

  11. 11

    将两个元素列表合并为一个元素相同但每个元素有两个变量的列表

  12. 12

    两个列表之间的公共元素并保留两个列表中元素的顺序

  13. 13

    合并两个相同长度的 Scala 列表,相同索引处的元素成为一个元素

  14. 14

    合并两个重叠列表的Pythonic方法,保留顺序

  15. 15

    按保留顺序随机合并两个列表

  16. 16

    合并两个排序列表并保留顺序

  17. 17

    按保留顺序随机合并两个列表

  18. 18

    通过对具有相同索引的元素求和来合并两个列表不起作用

  19. 19

    通过对具有相同索引的元素求和来合并两个列表不起作用

  20. 20

    如何合并列表列表中的两个元素?

  21. 21

    如何在larave中合并两个相同的集合

  22. 22

    如何基于对象索引合并两个列表-保留属性?

  23. 23

    合并两个列表,但保持相同的出现次数

  24. 24

    R:合并两个具有相同列名的列表

  25. 25

    元素相同的两个列表中的公共元素

  26. 26

    如何比较两个列表元素?

  27. 27

    合并两个列表

  28. 28

    Python:将两个相同长度的列表进行元素连接

  29. 29

    将两个列表合并为一个没有重复元素的保留顺序

热门标签

归档